首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >学习Java -不要完全理解这个序列是如何计算的(斐波纳契)

学习Java -不要完全理解这个序列是如何计算的(斐波纳契)
EN

Stack Overflow用户
提问于 2014-08-16 13:50:14
回答 1查看 350关注 0票数 0

我正在学习Java,我从互联网上获得了以下代码,并在Eclipse中运行:

代码语言:javascript
复制
public class Fibonacci {

    public static void main (String [] args) { 
        for (int counter = 0; counter <= 3; counter++){
            System.out.printf("Fibonacci of %d is: %d\n",  counter, fibonacci(counter));

    }

    public static long fibonacci(long number) {
        if ((number == 0) || (number == 1))
             return number;
        else
             return fibonacci(number - 1) + fibonacci(number - 2);
    }
}

我试着去理解它,但无法理解它。因此,我运行代码,counter通过fibonacci方法传入。计数器从0开始,这是首先传递的内容,然后是1和我理解的方法传回0,然后是1

达到2:时,它将返回2-1 + 2-2 = 2,并返回此值。

达到3:时,它将返回3-1 + 3-2 = 3,但不返回3,而是返回2

请有人解释一下为什么,因为我搞不懂这件事?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-16 14:00:04

首先,我必须告诉您,这个递归版本具有惊人的指数代价。一旦您了解了它的工作原理,我对您的建议将是学习尾递归,编写一个tail-recursive解决方案,一个迭代解决方案,并将它们与当前的“数字”值较高的方法进行比较。

然后,您的函数基本上使用Fibonacci序列的数学定义:

f0 = 1, f1 = 1, fn = fn-1 + fn-2 for all n >= 2

例如,如果我们调用fibonacci(3),这将返回fibonacci(2) + fibonacci(1)。fibonacci(2)将首先执行,并返回fibonacci(1) + fibonnacci(0)。然后fibonacci(1)将立即返回1,因为它是终端情况。fibonnacci(0)也会发生同样的情况,所以现在我们已经计算了fibonnacci(2) = 1 +0=1。让我们回到fibonacci(3),这一点已经被部分评估了:1+ fibonnacci(1)。我们只需计算fibonnacci(1),最后可以返回1+1= 2。

即使在这个小例子中,您也可以看到,我们计算了两次fibonacci(1),这就是为什么这个版本如此缓慢,它计算出序列中相同的值的许多倍,当"number“很高时,它就有了价值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25340791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档