我在实现一个函数时遇到问题,该函数使用列表推导计算所有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]
我没有得到编译错误或类似的东西,但是当我运行这些代码时,没有任何反应,它永远不会终止。
有人可以解释为什么会发生这种情况,并最终建议解决问题吗?
提前致谢!
答案 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
中的值,只取决于它的长度。)
我担心没有简单的解决办法,因为目前还不清楚代码是如何工作的。
我唯一的建议是停止思考循环。