使用foldl计算乘积和
Using foldl to calculate the product sum
基本上,我想用下面的算法计算一个列表:
myList = [a1, a2, a3, ... a8] -- 所有元素都是 Int
result = a[n] * n(其中 n 是从 0 开始的索引)
结果=a1*0+a2*1+a3*2....+a8*7
下面的代码有效。
prodSum xs = helper 0 xs
where helper a (x:xs) =
let a' = (a + 1)
in a * x + helper a' xs
helper a _ = 0
然而,我被要求使用foldl来实现它,我尝试了但没有成功。谁能提出解决方案?
为了只用 foldl
做到这一点,我们需要考虑在遍历列表时需要保持什么状态。
在这种情况下,我们需要当前项目的索引(从 0 开始)和当前总和(也从 0 开始)。我们可以将它们都存储在一个元组中。
在每一步中,我们将当前索引乘以当前值相加到总和中,并将索引递增 1。
foldl 完成后,我们可以丢弃索引和 return 总和。
Prelude> prodSum = fst . foldl (\(sum, i) x -> (sum + x * i, i + 1)) (0, 0)
Prelude> prodSum [1..2]
2
Prelude> prodSum [1..5]
40
Prelude> prodSum [1..8]
168
基本上,我想用下面的算法计算一个列表:
myList = [a1, a2, a3, ... a8] -- 所有元素都是 Int
result = a[n] * n(其中 n 是从 0 开始的索引)
结果=a1*0+a2*1+a3*2....+a8*7
下面的代码有效。
prodSum xs = helper 0 xs
where helper a (x:xs) =
let a' = (a + 1)
in a * x + helper a' xs
helper a _ = 0
然而,我被要求使用foldl来实现它,我尝试了但没有成功。谁能提出解决方案?
为了只用 foldl
做到这一点,我们需要考虑在遍历列表时需要保持什么状态。
在这种情况下,我们需要当前项目的索引(从 0 开始)和当前总和(也从 0 开始)。我们可以将它们都存储在一个元组中。
在每一步中,我们将当前索引乘以当前值相加到总和中,并将索引递增 1。
foldl 完成后,我们可以丢弃索引和 return 总和。
Prelude> prodSum = fst . foldl (\(sum, i) x -> (sum + x * i, i + 1)) (0, 0)
Prelude> prodSum [1..2]
2
Prelude> prodSum [1..5]
40
Prelude> prodSum [1..8]
168