c#递归检查是否均匀

时间:2016-12-19 21:37:02

标签: c# if-statement recursion

我需要帮助理解这一点。我真的不明白这段代码,有人可以在这里解释究竟会发生什么吗?

所以这就是代码:

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)。

我不明白这段代码,但它有效。老实说,我很困惑。

3 个答案:

答案 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)

现在,我们正在使用IsEvenIsEven(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;
}

您可以用Atrue代替false来说服自己。

现在我们只需将A替换为IsEven(n-1)并将其粘贴到上面的代码中即可获得原始

static bool IsEven(int n)
{
    if (n == 0) return true;

    if (IsEven(n - 1))
    {
        return false;
    }
    else
    {
        return true;
    }
}