我仍然围着递归包裹着我的思绪,而且我认为我得到的是基本因素,例如阶乘。但是,如果返回语句稍微复杂一点,我想进一步澄清,如下面的代码片段所示:
/**
* @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)步骤(这是否有意义)?如果是这样,这似乎很难想象。
答案 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可能会有所帮助。