多次返回的递归混淆

时间:2017-08-15 17:02:32

标签: java recursion

我仍然围着递归包裹着我的思绪,而且我认为我得到的是基本因素,例如阶乘。但是,如果返回语句稍微复杂一点,我想进一步澄清,如下面的代码片段所示:

/**
 * @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
    }
}

在返回语句中,斐波纳契(n-1)是否完全重复,然后沿着斐波纳契(n-2)步骤(这是否有意义)?如果是这样,这似乎很难想象。

4 个答案:

答案 0 :(得分:11)

是的,在另一个调用开始执行之前,一个调用将一直递减并返回。

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

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

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

答案 1 :(得分:1)

与调用不同于自身的功能相比,它没有什么不同。它需要在调用函数可以对结果执行任何操作之前完成。

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的调用会在两次递归调用完成时等待,就像执行System.out.println的函数会等到它打印出来一样在继续下一行之前的论点。递归并不是那么特别。

Trivia:这是Fibonacci本人的原创系列。现代数学家以n作为基本案例结果开始系列0, 1, 1, 2, ...而不是1, 1, 2, 3, ...

答案 2 :(得分:0)

它以这种方式工作:

Fibonacci计划

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

答案 3 :(得分:0)

在多次递归中,程序通过第一次调用调用自身,直到达到基本情况,在这种情况下 fibonacci(n-1);之后,递归停止并返回其值以继续将值调用到递归的第二部分 fibonacci(n-2)

如果你没有在程序中可视化多次递归,那么这就是 fibonacci recursion tree可能会有所帮助。