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

eimct9ow  于 2023-01-10  发布在  .NET
关注(0)|答案(4)|浏览(149)

正在进行我的.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();
    }
}
}
z0qdvdin

z0qdvdin1#

请学习堆栈展开。
我会尽力给予你一个主意。

  • 调用顺序将是写入控制台(3),然后写入控制台(2),然后写入控制台(1),然后写入控制台(0)。
  • WriteToConsole(0)将向WriteToConsole(1)返回-1,因此它不会再次进入while循环。
  • WriteToConsole(1)将向WriteToConsole(2)返回0,因此它不会再次进入while循环。
  • WriteToConsole(2)将返回1给WriteToConsole(3),因此它将满足条件(i〉0)并写入控制台。
pexxcrt2

pexxcrt22#

下面是代码流程的一个例子,每一个缩进代表一个新的堆栈(递归调用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,3,2,1,1

umuewwlo

umuewwlo3#

这与递归方法处理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执行。

这会产生以下结果:

loop 3
loop 2
loop 1
loop 1
2mbi3lxu

2mbi3lxu4#

其原因是循环内部存在递归调用。对于初始值3,循环将执行3次,但由于递归调用,它也将启动一个初始值为2的新循环,该循环将执行一次。
初始值越高,结果中的重复次数越多

相关问题