简单的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();
    }
}
}

简单的while循环重复最后一个值

请学习堆栈展开。

我会试着给你一个主意。

  • 调用顺序将是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的新循环,该循环将执行一次。

初始值越高,结果中的重复次数就越多