问题
请解释这个简单的代码:
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。
#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.你可以使用相同的方法来计算其他迭代。