trib :: Int -> Int
trib 1 = 1
trib 2 = 1
trib 3 = 2
trib n | n > 3 = trib (n-3) + trib (n-2) + trib (n-1)
这段代码生成了一个Tribonacci序列,但是速度非常慢
如何使用状态单子来做类似的事情,并且花费更少的时间?
在使用教科书中的斐波那契代码后,我能够得到一个基本的 backbone ,但不确定statTrib操作
stateTrib :: Integer -> State (Integer,Integer,Integer) ()
stateTrib = ???
runStateTrib :: Integer -> Integer
runStateTrib n = let ((),(a,b,c)) = (runState (stateTrib n) (1,0,0)) in a
1条答案
按热度按时间j5fpnvbx1#
你不需要
State
来有效地求解它,只需要使用普通递归来更新累加器:但如果您真的希望使用
State
,则可以更改累加器的访问方式:请注意,
State
版本更可能比普通递归慢(不确定优化器如何处理它)。