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