Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
学习Java-不完全理解这个序列是如何计算的(斐波那契)_Java_Fibonacci - Fatal编程技术网

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

学习Java-不完全理解这个序列是如何计算的(斐波那契),java,fibonacci,Java,Fibonacci,我正在学习Java,我从internet获得了以下代码,并在Eclipse中运行: 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, fibonac

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

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);
    }
}
公共类Fibonacci{
公共静态void main(字符串[]args){

对于(int counter=0;counter首先,我必须告诉您,这个递归版本有一个巨大的指数成本。一旦您了解了它的工作原理,我给您的建议是了解尾部递归性,编写一个尾部递归解决方案,一个迭代解决方案,并将它们与您当前的解决方案进行比较“数字”高值的方法

然后,函数基本上使用斐波那契序列的数学定义:

f0=1,f1=1,fn=fn-1+fn-2表示所有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


即使在这个小例子中,你也可以看到我们计算了两次斐波那契(1),这就是为什么这个版本如此缓慢,它计算了很多次相同的序列值,当“数字”很高时,它就值了。

-你可能还想对“递归”做些研究在
fibonacci
函数中使用3
println
s来显示:(1)调用时,带有参数值;(2)和(3)在
返回之前通过函数的每个路径上。然后查看结果,您应该能够理解它。[或使用调试器]fib(2)=fib(2-1)+fib(2-2)=fib(1)+fib(0)=1.fib(3)=fib(3-1)+fib(3-2)=fib(2)+fib(1)=1+1=2。此外,手工计算算术表达式时要小心。
2-1+2-2
=
1+0
@Eran感谢你的帮助,但只有在阅读下面的内容并弄清楚发生了什么之后,这才有意义:(3)=fib(3-1)+fib(3-2)=fib(1)=1+1=2。因此它将这些方法称为(3-1)+3-2)=fib(2)+fib(1)=1+1=2。我从您的示例和阅读其他示例中了解,所以您输入fibonacci(3),这将返回fibonacci(2)+fibonacci(1)。它返回fibonacci(1)+fibonacci(0)。然后向前工作,并将这些值提供给fibonacci(3)但是你写的那部分让人困惑:现在我们计算了fibonnacci(2)=1+1=2。因为fibonacci(2)是=1,因为fibonacci(1)+fibonacci(0)是1。而你写的那部分我们只需要计算fibonnacci(1),我们最终可以返回2+1=3。但是它没有返回3作为fibonacci(3)它返回了2。我的错,我使用了另一个斐波那契序列的定义,其中f0=1,f1=1等等,而你用f0=0,f1=1来定义,所以我给你的结果不是f3和你的定义,而是f2。我纠正了它。现在,正如我告诉你的,我强烈建议你阅读关于尾部递归性的内容,并尝试编写一个迭代版本。你我们将看到,如果使用不当,递归性将如何提供较差的性能。