如何将参数传递给更快的斐波那契实现

时间:2019-01-25 15:02:49

标签: haskell

我正试图加快我的斐波那契计算器的速度。

执行速度较慢:

fib :: Integer -> Integer
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

在这种情况下,如果我在cmd中尝试fib10,它将打印正确的第十斐波那契数字。

实施速度更快:

fib :: [Integer]
fib = 0:1:zipWith (+) fib (tail fib)

在这种情况下,如果我在cmd中尝试fib10,则显然将不起作用,因为我不再传递参数n了。

我试图解决此问题,但我不知道。

我尝试过:

fib :: Integer-> Integer
fib n = 0:1:zipWith (+) fib (tail fib)

fib :: [Integer]
fib n = 0:1:zipWith (+) fib (tail fib)

我能够通过添加在斐波那契数列中打印第10个数字

fib 10 = fib !! 10

并致电fib 10,但我希望能够打印任何号码。 fib n = fib !! n不起作用。

所以我的问题是:如何在更快的实现中传递参数,并能够在斐波那契数列中要求任何数字n?

1 个答案:

答案 0 :(得分:8)

您不能使用fib作为获取第n个斐波那契数的函数的名称以及生成列表的名称。

这应该有效:

fibList = 0:1:zipWith (+) fibList (tail fibList)

fib n = fibList !! n