我的Fibonacci实施有什么问题?

时间:2015-09-06 08:41:08

标签: haskell fibonacci

我试图将递归的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 y1 y匹配时返回,但它不会按预期工作。对于fib_itt 0fib_itt 1,它可以正常工作,但对于n > 1,它无法正常工作。例如,fib_rek 2返回1fib_rek 3返回2

1 个答案:

答案 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