基本上,我希望使用如下演算法計算一個串列:
myList = [a1, a2, a3, ... a8] -- 所有元素都是 Int
結果 = 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 來實作它,我嘗試了但沒有成功。任何人都可以提出解決方案嗎?
uj5u.com熱心網友回復:
為此foldl,我們需要考慮在遍歷串列時需要保持什么狀態。
在這種情況下,我們需要當前專案的索引(從 0 開始)和當前總和(也從 0 開始)。我們可以將它們都存盤在一個元組中。
在每一步,我們將當前索引乘以當前值加到總和中,并將索引加 1。
foldl 完成后,我們可以丟棄索引并回傳總和。
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/487876.html
標籤:哈斯克尔
