Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.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
Recursion 斐波那契序列它是如何工作的_Recursion_Fibonacci - Fatal编程技术网

Recursion 斐波那契序列它是如何工作的

Recursion 斐波那契序列它是如何工作的,recursion,fibonacci,Recursion,Fibonacci,我对Java是如何运行这个特定代码感到困惑。我对斐波那契数列很满意,但并不完全了解如何让我的头脑了解这个特定方法的运行方式。很明显,如果n为0,我返回0,如果n为1,我返回1。现在让我们假设我通过了3个n。我们返回fib(2)+fib(1)。如果它一开始从未计算过fib(2),它怎么知道fib(2)是什么?它是否再次通过整个函数来找出fib(2)是什么?什么时候停?我的心要爆炸了 public static int fib(int n){ if (n == 0){ re

我对Java是如何运行这个特定代码感到困惑。我对斐波那契数列很满意,但并不完全了解如何让我的头脑了解这个特定方法的运行方式。很明显,如果n为0,我返回0,如果n为1,我返回1。现在让我们假设我通过了3个n。我们返回fib(2)+fib(1)。如果它一开始从未计算过fib(2),它怎么知道fib(2)是什么?它是否再次通过整个函数来找出fib(2)是什么?什么时候停?我的心要爆炸了

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

}

您正在体验编程/数学中最酷的概念之一,称为递归。它可以是美丽的,但也可以是诅咒。在开始学习递归函数时,我也被这些编译过的自调用怪物逼疯了,但过了一段时间,我意识到有多少问题可以用递归更容易地解决。回到你的问题上来

所以根据维基百科,斐波那契序列是

“斐波那契数的序列Fn由递推关系定义:

n是当前的数字

所以在开始的时候我们打个比方

fib(3);
在它调用的方法中

fib(2);
然后在fib(2)中,它调用

这将返回1(因为if),所以这将返回fib(2),fib 2调用fib(0)的结果为0 所以fib(2)返回1

因为fib(3)被其他方法打断了,它仍然在返回点上。现在看起来是这样的

return 1 + fib(3 - 2)
fib(1)返回1 so

fib在末尾返回2

这有点难以解释,但我想你很快就会明白的

提示:当你不能理解某些东西是如何执行的时,使用调试器。它在可视化数据和算法方面帮助很大。它帮助你更快地理解。
fib(1)

此函数调用自身。Lots。“它是否再次遍历整个函数以找出fib(2)是什么?”是的,这就是递归。它何时停止?“当不调用方法本身的条件满足时-在这种情况下,即
n==0 | | n==1
时。我强烈建议您查看重复问题的答案。特别是chro的答案,这是我认为最好的答案,但目前是该页面上投票率第二高的答案。完美的解释,非常感谢你。。。把代码写在纸上,这比在我脑子里想的要清楚得多。节日快乐。
fib(1)
return 1 + fib(3 - 2)