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

时间:2016-10-14 16:44:17

标签: c# .net loops

使用我的.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();
    }
}
}

4 个答案:

答案 0 :(得分:8)

请研究堆栈展开。

我会尽力给你一个想法。

  • 调用顺序将是WriteToConsole(3)然后是WriteToConsole(2) WriteToConsole(1)然后WriteToConsole(0)。
  • WriteToConsole(0)将返回-1到WriteToConsole(1),所以它不会去 在while while循环。
  • WriteToConsole(1)将0返回WriteToConsole(2),所以它不会去 在while while循环。
  • WriteToConsole(2)将返回1到WriteToConsole(3),因此它将满足 条件(i> 0)并写入控制台。

答案 1 :(得分:1)

这是代码流程的一个例子。每个indention代表一个新的堆栈(递归调用rootReducer = combineReducers({ moduleA: combineReducers({ popupA: popupReducer("id1"), popupB: popupReducer("id2") }), moduleB: combineReducers({ popupA: popupReducer("id3") }) }) }); )并且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 的重新调用基本上写入当前数字然后递减。这将导致写出3到1.但是你可以看到,在第一组递归调用之后,本地WriteToConsole变量将被设置为1,你将再次通过i循环,因此它将第二次打印1。因此,给它一个起始数为4将产生4,3,2,1,1,2,1的输出。并且传入5将得到5,4,3,2,1,1,2 ,1,3,2,1,1

答案 2 :(得分:0)

原因是它在循环中存在递归调用。 对于初始值3,循环将执行3次,但由于递归调用,它还将启动一个初始值为2的新循环,该循环将执行一次。

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

答案 3 :(得分:0)

它与递归方法如何处理i有关。每次调用WriteToConsole时,它都会返回减去1的nubmer。但是当在while循环中调用它时,它会被i - 1调用,所以实际上该方法正在执行{{ 1}}。使用此模式运行每个数字时,会出现以下行为:

  • i = i - 2;执行两次:一次针对WriteToConsole(3);,一次针对3
  • 1针对WriteToConsole(2);执行一次,但不针对2执行。
  • 0针对WriteToConsole(1);执行一次,但不针对1执行。
  • -1仅在嵌套递归返回后才执行WriteToConsole(3);

产生以下结果:

1