Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 简单while循环重复最后一个值_C#_.net_Loops - Fatal编程技术网

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

C# 简单while循环重复最后一个值,c#,.net,loops,C#,.net,Loops,正在进行我的.net基础认证。在实践测试中,有一个问题与一些示例代码一起询问输出。正确答案是。。。 环路3 环路2 回路1 回路1 问题是我不明白为什么它会重复最后一个循环1。我把它放到VS2015中,发现它实际上是正确的。注意,我不是要求代码被修复,我是要求解释为什么它重复最后一个值。我已经搜索过了,没有找到明确的答案。这是代码 namespace ConsoleApplication5 { class Program { private static int WriteToConso

正在进行我的.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)
    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,然后写入控制台2 写入控制台1,然后写入控制台0。 WriteToConsole0将返回-1到WriteToConsole1,因此它不会运行 再次进入while循环。 WriteToConsole1将向WriteToConsole2返回0,因此它不会运行 再次进入while循环。 WriteToConsole2将向WriteToConsole3返回1,因此它将满足 条件i>0并写入控制台。
这是因为循环中存在递归调用。 对于初始值3,循环将执行3次,但由于递归调用,它还将启动一个初始值为2的新循环,该循环将执行一次


初始值越高,结果中重复的次数就越多,这与递归方法如何处理i有关。每次调用WriteToConsole时,它返回给定的数值减去1。但是当它在while循环中被调用时,它是用i-1调用的,因此实际上该方法正在执行i=i-2;。使用此模式运行每个数字时,您会得到以下行为:

写控制台3;执行两次:一次用于3,一次用于1。 书面报告2;对2执行一次,但对0不执行。 写控制台1;对1执行一次,但对-1不执行。 写控制台3;仅在嵌套递归返回后执行1。 这将产生以下结果:

loop 3
loop 2
loop 1
loop 1

下面是代码流的一个示例。每个缩进表示对WriteToConsole的新堆栈递归调用,并且在代码的该步骤中,i变量已替换为它的当前值

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)
    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

了解这一点的最佳方法是在WriteToConsole3设置断点;在主程序中,一步一步地调试。谢谢Vivek。关于研究堆栈展开的注释甚至比解释这个特定问题更有用。这正是我需要的。