我正试图加快我的斐波那契计算器的速度。
执行速度较慢:
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?
答案 0 :(得分:8)
您不能使用fib
作为获取第n个斐波那契数的函数的名称以及生成列表的名称。
这应该有效:
fibList = 0:1:zipWith (+) fibList (tail fibList)
fib n = fibList !! n