有人可以解释多余的1来自何处吗?

时间:2019-11-12 17:53:01

标签: c# loops while-loop

我在c#中有以下代码

class Program
{
    private static int WriteToConsole(int NumWrites)
    {
        int i  =  NumWrites;
        while( i > 0)
        {
            Console.WriteLine("Loop {0}",  i);
            i = WriteToConsole( i – 1);
        }
        return NumWrites – 1;
    }   
    static void Main()
    {   
        WriteToConsole(3);
        Console.ReadKey();
    }
}

出现问题“控制台运行此命令后会显示什么?”

正确答案是 3 2 1 1

但是我不知道在这个循环中多余的来自哪里。 在向控制台写入 1 的第一个循环之后,不返回NumWrites(此时为1)减去1等于0,使 int i 变为0,并停止循环,然后才能再次以0运行?我知道我错过了一步,但确实可以确定问题所在。

2 个答案:

答案 0 :(得分:3)

我用一些打印语句修改了您的代码,以帮助了解循环在这里的位置:

private static int WriteToConsole(int NumWrites)
    {
        int i  =  NumWrites;
        Console.WriteLine("i is " + i);
        Console.WriteLine("NumWrites is " + NumWrites);
        while( i > 0)
        {
            Console.WriteLine("Loop {0}",  i);

            Console.WriteLine("Calling WriteToConsole(" + (i-1) + ")" + "\n");
            i = WriteToConsole( i - 1);
            Console.WriteLine("i is now " + i + "\n");
        }

        Console.WriteLine("Returning " + (NumWrites - 1));
        return NumWrites - 1;
    }

这将打印以下内容:

i is 3
NumWrites is 3
Loop 3
Calling WriteToConsole(2)

i is 2
NumWrites is 2
Loop 2
Calling WriteToConsole(1)

i is 1
NumWrites is 1
Loop 1
Calling WriteToConsole(0)

i is 0
NumWrites is 0
Returning -1
i is now -1

Returning 0
i is now 0

Returning 1
i is now 1

Loop 1
Calling WriteToConsole(0)

i is 0
NumWrites is 0
Returning -1
i is now -1

Returning 2

这向我们展示了i为1和0的最后两种情况下发生的情况。当调用WriteToConsole(0)时,实际上没有进入while循环。而是返回NumWrites - 1。然后,递归的“树”被展开,因为您遇到了递归的情况。

由于i现在小于0,因此多次击中return NumWrites - 1语句,但倒退了:首先,返回-1。然后,0被返回。然后,1被返回。返回1时,这会将i再次设置为1。发生这种情况时,Loop 1将第二次打印。

返回最后2个后,您的递归“树”已展开。

答案 1 :(得分:1)

了解这一点的最好方法是考虑WriteToConsole函数在每次迭代中接受什么以及返回什么:

Inputs: 3  -> 2 -> 1 -> 0
Outputs: -1 -> 0 -> 1 -> 0

由于while循环中的条件是i> 0,因此从函数返回1后将执行一个额外的操作。