【问题标题】:Fibonacci Sequence How is it Working [duplicate]斐波那契数列是如何工作的[重复]
【发布时间】:2018-06-03 11:40:02
【问题描述】:

我对 Java 如何运行此特定代码感到困惑。我对斐波那契数列感到满意,但不完全了解如何让我的思想了解这种特定方法的运行方式。所以很明显,如果 n 为 0,我将返回 0,如果 n 为 1,则返回 1。现在让我们说我为 n 传递了 3。我们返回 fib(2) + fib(1)。如果它一开始就没有计算过,它怎么知道 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));

}

【问题讨论】:

  • 这个函数调用自己。很多。
  • "是否会再次遍历整个函数以找出 fib(2) 是什么?" 是的,这就是递归。 "什么时候停止?" 当满足不调用方法本身的条件时——在本例中为n == 0 || n == 1时。
  • 我强烈建议您查看重复问题的答案。尤其是 chro 的答案,在我看来是最好的答案,但目前是页面上投票第二高的答案。

标签: recursion fibonacci


【解决方案1】:

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

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

"斐波那契数列Fn由递推关系定义:

F n = F n−1 + F n−2

n 是当前数字。

所以一开始我们叫for example

fib(3);

在它调用的方法中

fib(2);

然后在 fib(2) 中调用

fib(1)

this 返回 1(因为 if)所以 this 到达 fib(2) 并且 fib 2 调用 fib(0) 结果为 0 所以 fib(2) 返回 1

因为 fib(3) 被其他方法中断,所以它仍然处于返回点。目前看起来是这样的。

return 1 + fib(3 - 2)

fib(1) 返回 1 所以

fib 最后返回 2

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

提示:当您无法理解某项操作的执行方式时,请使用调试器。它对可视化数据和算法有很大帮助。它可以帮助您更快地理解。 fib(1)

【讨论】:

  • 完美的解释,非常感谢...将代码写在纸上,这比在我的脑海中尝试要清楚得多。节日快乐。
猜你喜欢
  • 1970-01-01
  • 2015-06-05
  • 2011-05-06
  • 2020-03-09
  • 2012-02-09
  • 2013-08-03
  • 2014-05-19
相关资源
最近更新 更多