fibonacci java递归,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。

#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.你可以使用相同的方法来计算其他迭代。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值