haskell - 为什么这种斐波那契的实现速度非常快?

标签 haskell recursion fibonacci

斐波那契的这种实现很容易理解,但速度很慢:

fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

斐波那契的实现很难理解,但速度非常快。它会立即在我的笔记本电脑上计算出第 100,000 个斐波那契数。
fib = fastFib 1 1

fastFib _ _ 0 = 0
fastFib _ _ 1 = 1
fastFib _ _ 2 = 1
fastFib a b 3 = a + b
fastFib a b c = fastFib (a + b) a (c - 1)

关于后一种实现,这里发生了什么魔力,它是如何工作的?

最佳答案

隐藏输入数字被用作计数器的事实只是混淆。我希望如果你看到这样的东西,你会明白为什么:

fib2 n = fastFib2 0 1 0 n

fastFib2 current previous count 0 = 0
fastFib2 current previous count 1 = 1
fastFib2 current previous count n
  | count == n = current
  | otherwise  =
     fastFib2 (current + previous) current (count + 1) n

在上面的代码中,我们明确了计数器:当它等于我们的输入时,n ,我们返回我们的累加器,current ;否则,我们将跟踪当前和先前数字(“two preceding ones”)的这种“前向”递归,这是构造斐波那契数列所需的一切。

您共享的代码做同样的事情。 (c - 1)使它看起来像一个更传统的“向后”重复,当它实际上是在第一次调用时从累加器开始,然后添加到它。

关于haskell - 为什么这种斐波那契的实现速度非常快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54843670/

相关文章:

parsing - 使用 Haskell/Parsec 转换\"into "

algorithm - Haskell求两个最近点之间的距离

javascript - 跟踪调用递归函数的次数

使用递归的 JavaScript 斐波那契数列

斐波那契的表现

haskell - 需要帮助理解 haskell 中的函数应用运算符

haskell - 打印两个数字的总和 Haskell

java - 在递归中初始化变量

java - 使用递归方法嵌套缩进输出

java - 打印斐波那契数列的结果