关于实现计算斐波那契数列的函数的担忧

Concerns about implementing a function calculating Fibonacci series

我在实现一个函数时遇到问题,该函数为所有 n>1 的列表理解计算斐波那契数列。我在 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]

我没有遇到编译错误或类似的错误,但是当我 运行 这些代码时,什么也没有发生,它永远不会终止。

有人可以解释为什么会发生这种情况,并最终推荐解决问题的方法吗?

提前致谢!

定义

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] 创建了一个包含 nx 副本的列表。
(这并不奇怪,因为元素不依赖于 goThrough n 中的值,只依赖于它的长度。)

恐怕没有简单的解决方法,因为尚不清楚代码的工作原理。
我唯一的建议是停止考虑循环。