【问题标题】:Recursion confusion with multiple return多重返回的递归混淆
【发布时间】:2018-01-23 16:00:08
【问题描述】:

我仍然在考虑递归,我想我得到了像阶乘这样的基本方法。但是,当 return 语句像下面的 sn-p 一样复杂一点时,我想进一步澄清:

/**
 * @param n >= 0
 * @return the nth Fibonacci number 
 */
public static int fibonacci(int n) {
    if (n == 0 || n == 1) {
        return 1; // base cases
    } else {
        return fibonacci(n-1) + fibonacci(n-2); // recursive step
    }
}

在 return 语句中,fibonacci(n-1) 是否完全重复,然后再执行 fibonacci(n-2) 步骤(这有意义吗)?如果是这样,这似乎很难想象。

【问题讨论】:

  • 如果难以想象,只需使用调试器逐步检查您的代码。这会准确地告诉你发生了什么。
  • 假设上面是单线程的,是的。
  • fibonacci(n-1) + fibonacci(n-2);的顺序不明确,可以先执行
  • 你也可以在纸上做。尝试使用 n = 4,这只是几个步骤。
  • 公共静态气味 JAVA

标签: java recursion


【解决方案1】:

是的,一个调用将一直递归下去并返回,然后另一个调用开始执行。

Java 中的调用顺序是明确定义的:fibonacci(n-1)fibonacci(n-2) 之前。

编辑: 由于问题最初包含 [C++] 标记,因此这里是故事的 C++ 部分:两个调用之一仍然必须在另一个调用开始运行之前完成,但是哪个一,fibonacci(n-1)fibonacci(n-2),未指定。

由于该函数没有副作用,因此两个调用中的哪一个先运行并不重要。唯一对理解递归很重要的是,在当前级别的调用返回之前,两个调用都必须完成,并且它们的结果必须相加。

【讨论】:

  • 既然 C++ 标记已被删除,您可能应该编辑您的答案。
【解决方案2】:

这与调用与自身不同的函数没有太大区别。它需要在调用函数对结果执行任何操作之前完成。

finobacci(0); // ==> 1 (since n is zero, the base case is to return 1)
fibonacci(1); // ==> 1 (since n is one, the base case is to return 1)

现在让我们试试2,这不是基本情况:

fibonacci(2);                // == (since it's not the base case)
fibonacci(1) + fibonacci(0); // == (both calls to fibonacci we already haver done above)
1 + 1                        // ==> 2

所以实际上发生的情况是,对 fibonacci2 的调用会等待,而对 finish 的两个递归调用中的每一个都会等待,就像执行 System.out.println 的函数会等到它之前打印过参数继续下一行。递归并不是那么特别。

琐事:这是斐波那契本人的原创系列。现代数学家以n 开始系列作为基本案例结果,使系列0, 1, 1, 2, ... 而不是1, 1, 2, 3, ...

【讨论】:

  • @Hulk 更正了评论。
【解决方案3】:

它是这样工作的:

斐波那契程序

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

解释: 在斐波那契数列中,每一项都是前两项之和。所以,按照递归算法。

所以,

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

【讨论】:

    【解决方案4】:

    在多重递归中,程序在第一次调用时调用自身,直到达到基本情况,在本例中为 fibonacci(n-1);之后递归停止并返回他的值以继续调用该值到递归的第二部分fibonacci(n-2)

    如果您没有将程序中的多重递归可视化,这 fibonacci recursion tree 可能会有所帮助。

    【讨论】:

      猜你喜欢
      • 2015-04-27
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      相关资源
      最近更新 更多