正在进行我的.net基础认证。在一次实践测试中,有一个问题,其中包含一些要求输出的示例代码。正确答案是... Loop 3 Loop 2 Loop 1 Loop 1
问题是我不明白为什么它重复最后一个“循环1”。我把它放到VS2015中,发现它实际上是正确的。注意,我不是要求代码被修复,我是要求解释为什么它重复最后一个值。我已经搜索过了,没有找到一个明确的答案。所以,这里的代码。
namespace ConsoleApplication5
{
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(string[] args)
{
WriteToConsole(3);
Console.ReadKey();
}
}
}
4条答案
按热度按时间z0qdvdin1#
请学习堆栈展开。
我会尽力给予你一个主意。
pexxcrt22#
下面是代码流程的一个例子,每一个缩进代表一个新的堆栈(递归调用
WriteToConsole
),并且i
变量在代码的这一步被替换为当前值。对
WriteToConsole
的递归调用基本上是写入当前的数字,然后递减,这将导致将3写入1,但您可以看到,在第一组递归调用之后,本地i
变量将被设置为1,并且您将再通过while
循环一次,因此它将第二次打印1。因此,如果初始数为4,则输出为4,3,2,1,1,2,1。如果传入5,则给予5,4,3,2,1,1,2,1,3,2,1,1umuewwlo3#
这与递归方法处理
i
的方式有关,每次调用WriteToConsole
时,它都会返回给定的nubmer减去1的值,但是当在while循环中调用它时,它是用i - 1
调用的,所以实际上该方法执行的是i = i - 2;
,当用这种模式运行每个数字时,你会得到如下的行为:WriteToConsole(3);
执行两次:一次用于3
,一次用于1
。WriteToConsole(2);
为2
执行一次,但不为0
执行。WriteToConsole(1);
为1
执行一次,但不为-1
执行。WriteToConsole(3);
仅在嵌套递归返回之后针对1
执行。这会产生以下结果:
2mbi3lxu4#
其原因是循环内部存在递归调用。对于初始值3,循环将执行3次,但由于递归调用,它也将启动一个初始值为2的新循环,该循环将执行一次。
初始值越高,结果中的重复次数越多