有Fibonacci數列表的優雅derinition:Corecursive使用遞歸斐波納契方案
fibs :: [Integer]
fibs = fib 1 1 where
fib a b = a : fib b (a + b)
能說是使用recursion-schemes
庫?
我能得到的最接近的是採用完全不同的方法下面的代碼:
fibN' :: Nat -> Integer
fibN' = histo $ \case
(refix -> x:y:_) -> x + y
_ -> 1
我可以提供的代碼,如果必要的休息,但實際上我用histomorphism獲取第n個斐波納契數納特=修復也許。 Maybe (Cofree Maybe a)
原來與[a]
同構,所以refix
可以被認爲只是一種toList
使模式更短。
UPD:
我發現了更短的代碼,但它只能存儲一個值和非通用方式:
fib'' :: [Integer] -> [Integer]
fib'' = ana $ \[email protected](x:y:_) -> Cons x (x + y : l)
:
fib' :: (Integer, Integer) -> [Integer]
fib' = ana $ \(x, y) -> Cons x (y, x+y)
保存完整的歷史記錄的非通用的方法
我已經想到了自己:)是否有某種組織形態變形爲我提供了所有過去的價值,而不僅僅是一種? – nponeccop
啊,但這並不是說你有一個過去的價值。您有一個* future *值,但由於數字的特殊對稱性,可以很容易地表達該數據結構(單值到未來的滑動窗口):每個數字都有* 1 *後繼者。一般來說,每個子結構都有很多可能的上層建築。如果你想要一種「爲x之前的東西而計算的值」,那麼x就是*依賴的。二十年前,在我發現斐波那契僅僅是一種僥倖之前,我失去了幾個月的時間來試圖將滑窗斐波那契概括爲值過程遞歸。 – pigworker