我试图将递归的Fibonacci函数转换为迭代解。我尝试了以下方法:
fib_itt :: Int -> Int
fib_itt x = fib_itt' x 0
where
fib_itt' 0 y = 0
fib_itt' 1 y = y + 1
fib_itt' x y = fib_itt' (x-1) (y + ((x - 1) + (x - 2)))
我想将结果保存到变量y
,并在x
y
与1
y
匹配时返回,但它不会按预期工作。对于fib_itt 0
和fib_itt 1
,它可以正常工作,但对于n > 1
,它无法正常工作。例如,fib_rek 2
返回1
,fib_rek 3
返回2
。
答案 0 :(得分:1)
您的算法错误:在y + (x-1) + (x-2)
中,您只添加连续数字 - 而不是fib.series中的数字。
看起来你尝试了某种配对方法(我认为) - 是的,这是一个好主意,可以像这样完成:
fib :: Int -> Int
fib k = snd $ fibIt k (0, 1)
fibIt :: Int -> (Int, Int) -> (Int, Int)
fibIt 0 x = x
fibIt k (n,n') = fibIt (k-1) (n',n+n')
如您所见:这将两个所需部分(最后一个和倒数第二个)作为一对数字传递,并使用k
跟踪迭代。
然后它只是在fib
中给出了这个元组的第二部分(如果你使用第一部分,你会得到0,1,1,2,3,...
但当然你也可以根据需要调整初始元组({ {1}})。
顺便说一下,如果你把迭代分解为fib k = fst $ fibIt k (1, 1)
,那么这个想法会直接导致对fib.sequence这个漂亮的定义;)
iterate