我需要帮助理解这一点。我真的不明白这段代码,有人可以在这里解释究竟会发生什么吗?
所以这就是代码:
static bool IsEven(int n)
{
if (n == 0) return true;
if (IsEven(n - 1))
{
return false;
}
else
{
return true;
}
}
然后我这样做:
Console.WriteLine(IsEven(10));
它是如何实际运作的?如果我输入数字10,则输出为true。如果我输入数字7,则打印出错误。但我不明白它为什么会起作用。
检查数字是否为0,然后返回true。但我输入10(显然不是0),它仍然打印出来。然后检查数字-1。
那就是10-1,这是9.但是怎么知道9不是偶数? (它返回false)。
我不明白这段代码,但它有效。老实说,我很困惑。
答案 0 :(得分:2)
使用较小的数字(如3)逻辑地遍历它,因此没有那么多的递归需要考虑。
我们第一次致电IsEven(3);
时会这样做:
if (3 == 0) return true;
3井不等于0所以继续这个:
if (IsEven(3 - 1))
与以下内容相同:
if (IsEven(2))
所以现在我们正在调用IsEven
。第一项检查是2 == 0
,当然不是,所以它继续IsEven(2 - 1)
。
现在,我们正在使用IsEven
与IsEven(1)
进行第三次通话。再好1 == 0
不是真的,所以继续IsEven(1 - 1)
。
现在我们正在与IsEven
进行IsEven(0)
的最终(第四次)调用。那么现在0 == 0
是真的,所以我们将true
返回到第三个电话。
所以现在回到第三个调用IsEven(1 - 1)
是true
所以它会在第一个括号中执行操作,即返回false
。
回到第二个电话IsEven(2 - 1)
现在是false
,因此它会在第二个括号中执行操作,即返回true
。
回到第一个调用IsEven(3 - 1)
是真的,所以它在第一个括号中采取行动,即返回false
,表明3确实不是偶数。
就像整数开始一样。
当然,一个真实的例子可能会像这样使用模%
运算符。
public static bool IsEven(int number)
{
return number % 2 == 0;
}
答案 1 :(得分:2)
这样想:
IsEven(3)
| IsEven(2)
| | IsEven(1)
| | | IsEven(0)
| | | Return True
| | Return False
| Return True
Return False
如果输入是非负的并且开始回到链中,它总是会最终变为0。上面IsEven(1)
表示IsEven(2)
和IsEven(3)
仍在执行中。那些方法调用还没有结束。
IsEven(n)
方法正在做的是返回较低数字的相反方向。传递4
表示必须检查3
是否均匀。由于它不是,4
将返回true。
正如其他人提到的那样,我建议写出来,但我也建议使用断点并使用Step-In
IDE命令进入IsEven
方法,以便观察参数值的变化并按照流程进行。或者至少添加一些Console.WriteLine
供你观看。
答案 2 :(得分:1)
让我们从数学开始尝试理解它。 0
甚至是一个定义。我们知道,1
的每次添加都会打破" eveness"数量。所以我们可以写出如下的反复规则:
Base case: IsEven(0) = true
Induction: IsEven(n) = NOT( IsEven(n-1) ) ; for n > 0
因此我们可以轻松编写代码:
static bool IsEven(int n)
{
if (n == 0) return true;
return (!IsEven(n - 1));
}
到目前为止一切顺利。但请注意,(!A)
可以改为改写为这个尴尬的条件:
if (A)
{
return false;
}
else
{
return true;
}
您可以用A
或true
代替false
来说服自己。
现在我们只需将A
替换为IsEven(n-1)
并将其粘贴到上面的代码中即可获得原始
static bool IsEven(int n)
{
if (n == 0) return true;
if (IsEven(n - 1))
{
return false;
}
else
{
return true;
}
}