简单的while循环重复最后一个值
本文关键字:最后一个 循环 while 简单 | 更新日期: 2023-09-27 18:13:03
正在申请。net基金会认证。在练习测试中,有一个带有一些示例代码的问题要求输出。正确答案是……循环3循环2循环1循环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();
}
}
}
请学习堆栈展开。
我会试着给你一个主意。
- 调用顺序将是WriteToConsole(3)然后WriteToConsole(2)WriteToConsole(1) then WriteToConsole(0).
- WriteToConsole(0)将返回-1到WriteToConsole(1),所以它不会去
- WriteToConsole(1)将返回0到WriteToConsole(2),所以它不会去
- WriteToConsole(2)将返回1到WriteToConsole(3),所以它将满足将条件(i> 0)写入控制台。
下面是代码流的一个示例。每次缩进都代表一个新的堆栈(递归调用WriteToConsole
),并且i
变量已经被替换为代码中该步骤的当前值。
WriteToConsole(3)
while(3>0)
Console.WriteLine(3)
WriteToConsole(2)
while(2>0)
Console.WriteLine(2)
WriteToConsole(1)
while(1>0)
Console.WriteLine(1)
WriteToConsole(0)
while(0>0)
return -1
while(-1>0)
return 0
while(0>0)
return 1
while(1>0)
Console.WriteLine(1)
WriteToConsole(0)
while(0>0)
return -1
while(-1>0)
return 2
对WriteToConsole
的递归调用基本上是先写当前的数,然后递减。这将导致输出3到1。但是您可以看到,在第一组递归调用之后,本地i
变量将被设置为1,并且您将通过while
循环再传递一次,因此它将第二次打印1。因此,给它一个开始的数字4将导致输出为4,3,2,1,1,2,1。输入5会得到5 4 3 2 1 1 2 1 1 1 1 1 3 2 1
这与递归方法如何处理i
有关。每次调用WriteToConsole
时,它返回给定的数字减去1。但是当它在while循环中被调用时,它是用i - 1
调用的,所以实际上该方法执行的是i = i - 2;
。当使用此模式运行每个数字时,您会得到以下行为:
-
WriteToConsole(3);
执行两次:一次为3
,一次为1
。 -
WriteToConsole(2);
对2
执行一次,但不执行0
。 -
WriteToConsole(1);
对1
执行一次,但不执行-1
。 -
WriteToConsole(3);
只在嵌套递归返回后对1
执行。
生成如下结果:
loop 3
loop 2
loop 1
loop 1
这样做的原因是在循环中有一个递归调用。对于初始值为3的循环将执行3次,但由于递归调用,它也将启动一个初始值为2的新循环,该循环将执行一次。
初始值越高,结果中的重复次数就越多