冒着听起来愚蠢的风险,为什么当条件块等于true时,以下方法返回结果而不是值1?
public long Recursive(int Input)
{
if (Input <= 1)
return 1;
else
return Input * Recursive(Input - 1);
}
答案 0 :(得分:11)
它确实在Input == 1
。
但返回的1与先前调用一起使用,乘以Input
,其返回值与先前调用一起使用,乘以Input
,其返回值与先前的呼叫,乘以Input
,其返回值与先前的呼叫一起使用,乘以Input
...直到您回到第一次呼叫Recursive
。
尝试查看使用值Recursive
致电3
时会发生什么:
- input is not 1, so it calls Recursive with the value 2 - input is not 1, so it calls Recursive with the value 1 - input is 1, 1 is returned - 2 * 1 is returned - 3 * 2 is returned
答案 1 :(得分:4)
通过一个简单的例子:递归(2)
invoke Recursive(2)
if(input <= 1) evaluates to false
so the else block is executed and the return value is 2 * Recursive(2 - 1)
invoke Recursive(1)
if(input <= 1) evaluates to true
so the return value of Recursive(2 - 1) is 1
thus the return value of Recursive(2) is 2 * 1 = 2
让我们通过另一个:递归(3)
invoke Recursive(3)
if(input <= 1) evalues to false
so the else block is executed adn the return value is 3 * Recursive(3 - 1)
but we just showed Recursive(2) evaluates to 2
so the return value of Recursive(3) is 3 * 2 = 6
答案 2 :(得分:2)
没有。它返回1,正如预期的那样,然后返回值返回调用堆栈并更改。
答案 3 :(得分:2)
它将返回Input
的阶乘。
递归是解决许多类型问题的常用技巧。 根据维基百科:
“计算机科学中的递归是一种方法,其中问题的解决方案取决于同一问题的较小实例的解决方案。该方法可以应用于许多类型的问题,并且是计算机科学的核心思想之一” 。
以下Scheme代码段将帮助您了解递归的工作原理。
答案 4 :(得分:0)
为 $ReturnValue1 设置监视并通过调试循环查看结果相乘。