[英]What is this functional programming optimization called?
考慮以下用於計算第 n 個斐波那契數的 Haskell 代碼。
fib :: Int -> Int
fib 0 = 0
fib 1 = 1
fib n = fib (n - 1) + fib (n - 2)
這段代碼很慢。 我們可以通過將其“存儲”所有相關數據以在其 arguments 中“存儲”所有相關數據來計算遞歸,重構為“迭代”計算的幫助程序 function 以及告訴我們計算多長時間的“計數器”來優化它。
fastfib :: Int -> Int
fastfib n = helper 1 0 n
where
helper a _ 1 = a
helper a b i = helper (a + b) a (i - 1)
似乎這種優化也可以更廣泛地應用。 它在函數式編程社區或其他地方有名字嗎?
它與monoids 、 tail-recursion-modulo-cons ("TRMC")、 corecursion 、 hylomorphism 、 folding等密切相關。
Monoids 啟用重新括號
a+(b+(c+...)) == (a+b)+(c+...) == ((a+b)+c)+...
這使得積累。 TRMC (在 Prolog 的上下文中被明確地知道)是相同的,只是列表;
[a]++([b]++([c]++...)) == ([a]++[b])++([c]++...) == (([a]++[b])++[c])++...
corecursion像 TRMC 一樣以自上而下的方式構建列表。
上面鏈接的答案包含指向弗里德曼和懷斯1974 年技術報告的鏈接,該報告本質上是在+
幺半群的背景下討論積累,例如。
斐波那契示例中沒有幺半群,但可以說是“知識”的積累,因為我們從一個斐波那契數到下一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.