歡迎來到 常識詞典網(wǎng) , 一個專業(yè)的常識知識學(xué)習(xí)網(wǎng)站!
[ Ctrl + D 鍵 ]收藏本站
答案 1:
因為純函數(shù)式語言是沒有狀態(tài)的,因此在一些循環(huán)計算的時候不能向過程式和OO語言那樣通過修改一個變量來達(dá)到計算的目的,比如對一個列表的數(shù)求和,pyt-on可以這樣:
sum = 0 for num in list: sum += num 而函數(shù)式語言是不能這樣的,只能是使用遞歸,最簡單的形式是(-askell表示): sum :: [Int] -> Int sum (x:xs) = x + sum xs sum [ ] = 0 其實,這里用-askell來做例子是不合適的,因為-askell是lazy evaluation,我們假設(shè)是strict evaluation的,(對不起,今天喝了點酒,lisp一下子也不出來了)。這其實是一個連加式,只有到了最后一項得到0后才能計算出結(jié)果。這是很耗內(nèi)存的。這時候就可以使用累加器了,累加器就是將當(dāng)前的計算結(jié)果放到參數(shù)里,也就是帶著當(dāng)前的狀態(tài)了。 sum :: Int -> [Int] -> Int sum a (x:xs) = sum (a+x) xs sum a [ ] = a 這里的a就是累加器。 因為用的是-askell,這里的累加器不是一個整數(shù),而是一個計算,只有到最后一步返回結(jié)果并且結(jié)果需要一定的計算的時候才會計算成一個整數(shù),否則結(jié)果就是一個連加式的t-unk,如果是lisp一類的strict evaluation語言,每一步的(a + x)都會計算,然后進(jìn)入下一個調(diào)用。即使如此,這兩個實現(xiàn)的區(qū)別還是很明顯的,第一個是普通遞歸,第二個是尾遞歸。如果是lisp,第二個內(nèi)存用量是不變的??偟膩碚f,累加器在strict evaluation的語言里是更常見的。答案 2:
我估計樓主問的是foldl,foldr中的累加器吧 比如sum可以用foldl實現(xiàn) *Main> foldl (\acc x -> acc + x) 0 [1..10] 55 這個acc被稱為累加器 foldl是個高階函數(shù),它接受一個函數(shù)f作為參數(shù),然后傳兩個參數(shù)給這個函數(shù)f 一個是累加器的初始值,上例中是0,另一個是列表中的第一個元素 函數(shù)f對初始值和第一個元素運算后產(chǎn)生新的累加器(acc+x),然后再取列表中的第二個元素再做同樣的運算,直到全部元素都計算完畢。 另外,上例也可以寫成更簡單的形式 *Main> foldl (+) 0 [1..10] 55下一篇:支付寶最終的命運是滅亡? 下一篇 【方向鍵 ( → )下一篇】
上一篇:據(jù)說男人婚前覺得女人都不一樣,婚后覺得都一樣,是不是這樣的? 上一篇 【方向鍵 ( ← )上一篇】
快搜