用Haskell計算前綴和的簡單方法是
scanl1( )[1, 2,3,4,5, 6]
這就產生了輸出
。[1, 3, 6,10, 15, 21]
我需要寫出反式,這是我想出來的:
我需要寫出反式。
undo_prefix_sum :: (Num a) => [a] -> [a]
undo_prefix_sum s = init $ snd $ foldr (cur (tot, l) -> (cur, (tot-cur):l)) (last s, [] ) (0: s)
這似乎是正確的(但我可能錯過了什么)。 是否有一個更簡單或更有效的方法來做這件事,可能使用掃描?
uj5u.com熱心網友回復:
在我看來,由于prefix_sum被自然地表達為一個折疊,undo_prefix_sum被更自然地表達為一個展開。
import Data.List
undo_prefix_sum = unfoldr (xs -> if null xs
then Nothing
else let (h:t) = xs
in Just (h, map ( subtract h) t) )
unfoldr使用一個函式從一個種子值開始建立一個串列。在這種情況下,種子是一個串列本身;我們在結果中使用種子的第一個元素,并將串列的其余部分作為種子(一個修改過的版本)來遞回計算其余結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/316893.html
標籤:
