我在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运行?我知道我错过了一步,但确实可以确定问题所在。
答案 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后将执行一个额外的操作。