关于实现计算Fibonacci系列

时间:2015-09-06 17:06:31

标签: haskell list-comprehension fibonacci

我在实现一个函数时遇到问题,该函数使用列表推导计算所有n> 1的Fibonacci系列。我有很多OOP的经验,我不是在编程功能上使用的。但是在您的下方,我会找到我正在尝试实现的功能的代码:

fib :: Int -> Int
nextLast :: [Int]->Int
insert' :: [Int]->[Int]
retrieve :: [Int]->Int
goThrough :: Int->[Int]

fibl = [0,1] --List of edge cases to be used in the iteration
nextLast a = a !! (length a - 2)
insert' a = a ++ [last a + nextLast a] --How to create the pattern of Fibonacci series in a

retrieve a = let a = insert' a
             in last a

goThrough n = replicate (n-1) 0

fib 0 = 0 --Edge case #1
fib 1 = 1 --Edge case #2
fib n = let times = goThrough n --n>1, n = any natural number
        in last [retrieve fibl | _<-times]

我没有得到编译错误或类似的东西,但是当我运行这些代码时,没有任何反应,它永远不会终止。

有人可以解释为什么会发生这种情况,并最终建议解决问题吗?

提前致谢!

1 个答案:

答案 0 :(得分:4)

定义

let a = insert' a

是一个递归定义;右侧的a指的是您定义的a

这就是ghci所说的:

*Main> retrieve fibl
*** Exception: <<loop>>

(交互式解释器是测试程序的一小部分的好方法。)

尝试

retrieve a = let b = insert' a
             in last b

修复后,您的程序还有其他问题:

*Main> fib 1
1
*Main> fib 2
1
*Main> fib 3
1
*Main> fib 400
1

看起来不正确,这里有一个线索:

*Main> [retrieve fibl | _ <- goThrough 3]
[1,1]
*Main> [retrieve fibl | _ <- goThrough 6]
[1,1,1,1,1]

理解[ x | _ <- goThrough n]创建一个包含n x份副本的列表。
(这并不奇怪,因为元素不依赖于goThrough n中的值,只取决于它的长度。)

我担心没有简单的解决办法,因为目前还不清楚代码是如何工作的。
我唯一的建议是停止思考循环。