尾递归Fibonacci

时间:2014-03-01 06:59:08

标签: python big-o fibonacci

如何在O(n)中没有循环运行的情况下实现递归Fibonacci函数?

4 个答案:

答案 0 :(得分:46)

通常情况下,我反对发布这样的家庭作业问题的答案,但到目前为止发布的所有内容似乎都过于复杂。正如上面的评论中所说,你应该像使用迭代一样使用递归来解决问题。

这是迭代解决方案:

def fib(n):
  a, b = 0, 1
  while n > 0:
    a, b = b, a+b
    n -= 1
  return a

这是一个等效的递归解决方案:

def fib(n):
  def fib_help(a, b, n):
    return fib_help(b, a+b, n-1) if n > 0 else a
  return fib_help(0, 1, n)

请注意,在这两种情况下,我们实际计算到F n + 1 ,但返回F n 作为结果。这非常适合你给出的“提示”。

我希望你花时间比较两种解决方案并说服自己相同。了解如何将迭代解决方案转换为等效的递归解决方案(反之亦然)是一项很好的开发技能。

答案 1 :(得分:1)

用于查找第n个Fibonacci数的Scala代码。 有关尾递归http://nerds.logdown.com/posts/1406258-n-th-fibonacci-number

的更多信息
object Main {
     def main(args: Array[String]) {
        println(fib(9));
        println(fib(8));
        println(fib(7));
        println(fib(6));
        println(fib(5));
        println(fib(4));
        println(fib(3));
        println(fib(2));
        println(fib(1));
        println(fib(0));
      }
      def fib(n: Int): Int = {
        def fib(n: Int, p :Int, c: Int): Int ={
          if (n == 0) return -1; // undefined
          if (n == 1) return p;
          fib(n-1, c, p + c)
        }
        fib(n, 0, 1);
      }
    }

答案 2 :(得分:0)

要在线性时间内解决此问题,必须使用称为memoization的动态编程技术。

伪代码中使用memoization的Fibonacci算法如下所示:

memoryMap[n]

func fib(int n)
    if (n is in memoryMap) then
        return memoryMap[n]
    if (n <= 1) then
        memoryMap[n] = n
    else
        memoryMap[n] = fib(n-1) + fib(n-2)

    return memoryMap[n]

为了解释,在每次调用fib(x)之后,您将结果存储在存储器映射中。对于每个后续调用,对fib(x)的所有查找都是空闲的:也就是说,在内存中查找结果仅花费O(1)时间。

答案 3 :(得分:0)

如果有人正在寻找JavaScript解决方案:

function _fib(n, left, right) {
  switch (n) {
    case 0: return 0
    case 1: return right
    default: return _fib(n - 1, right, left + right)
  }
}

function fib(n) {
  return _fib(n, 0, 1)
}

在O(n)时间和O(1)空间中运行尾部调用优化。