Java递归Fibonacci序列

问题

请解释这个简单的代码:

public int fibonacci(int n)  {
    if(n == 0)
        return 0;
    else if(n == 1)
      return 1;
   else
      return fibonacci(n - 1) + fibonacci(n - 2);
}

我与最后一行混淆,特别是因为如果n = 5例如,那么将调用fibonacci(4)fibonacci(3)等等但是我不明白这个算法如何通过这种方法计算索引5处的值。请详细解释!


#1 热门回答(141 赞)

在斐波那契序列中,每个项目是前两个项目的总和。所以,你写了一个递归算法。

所以,

fibonacci(5) = fibonacci(4) + fibonacci(3)

fibonacci(3) = fibonacci(2) + fibonacci(1)

fibonacci(4) = fibonacci(3) + fibonacci(2)

fibonacci(2) = fibonacci(1) + fibonacci(0)

现在你已经知道了fibonacci(1)==1 and fibonacci(0) == 0。因此,你可以随后计算其他值。

现在,

fibonacci(2) = 1+0 = 1
fibonacci(3) = 1+1 = 2
fibonacci(4) = 2+1 = 3
fibonacci(5) = 3+2 = 5

并且从斐波那契序列0,1,1,2,3,5,8,13,21....我们可以看出,对于5th element,斐波那契序列返回889153777。

在这里查看Recursion Tutorial


#2 热门回答(47 赞)

你的代码有两个问题:

  • 结果存储在int中,只能处理前48个斐波纳契数,此后整数填充减去位且结果错误。
  • 但你永远不能运行斐波那契(50)。代码斐波那契(n - 1)斐波纳契(n - 2)是非常错误的。问题在于它称斐波那契不是50倍而是更多。起初它称斐波那契(49)斐波那契(48),下斐波那契(48)斐波那契(47)和斐波那契(47)斐波那契(46)每次它变得更加斐波那契(n),因此复杂性呈指数增长。

非递归代码的方法:

double fibbonaci(int n){
    double prev=0d, next=1d, result=0d;
    for (int i = 0; i < n; i++) {
        result=prev+next;
        prev=next;
        next=result;
    }
    return result;
}

#3 热门回答(32 赞)

在伪代码中,其中n = 5,发生以下情况:

斐波那契(4)fibonnacci(3)

这分解为:

(fibonacci(3)fibonnacci(2))(fibonacci(2)fibonnacci(1))

这分解为:

(((fibonacci(2)fibonnacci(1))((fibonacci(1)fibonnacci(0)))(((fibonacci(1)fibonnacci(0))1))

这分解为:

((((fibonacci(1)fibonnacci(0))1)((1 0))((1 0)1))

这分解为:

((((1 0)1)((1 0))((1 0)1))

结果如下:5

鉴于fibonnacci序列是1 1 2 3 5 8 ...,第5个元素是5.你可以使用相同的方法来计算其他迭代。