作为初学者,我对以下C#递归的运行方式感到很困惑。
class program
{
public void Count(int inVal)
{
if(inVal == 0)
return;
Count(inVal - 1);
Console.WriteLine("{0}",inVal);
}
static void Main()
{
Program pr = new program;
pr.Count(3);
}
}
从我的观点来看,该计划'什么时候应该停止' intVal'达到0,因为流不能通过' if(intVal == 0)return;'。如何打印出来' 1 2 3'顺序?如果有人知道他们之间的原则,我将不胜感激。
答案 0 :(得分:3)
现在你的结构方式是,在打印出你在该级别的值之前递归调用Count()
,所以你的程序流程如下:
Main
--> Count(3)
--> Count(2)
--> Count(1)
--> Count(0) //here, the program returns because of your if
--> //prints 1
--> //prints 2
--> //prints 3
希望这能够显示当前程序的运行方式,并有助于处理它为什么按顺序打印出值。问题是递归调用后的代码仅在递归调用完成后执行 - 对于Count(3)
,这意味着Count(2), Count(1),
和Count(0)
都发生在Count(3)
中的print语句之前
答案 1 :(得分:2)
我记得也对递归感到困惑,所以让我们看看能解释会发生什么。
答案 2 :(得分:1)
在代码运行时跟随堆栈跟踪。请注意,在调用递归Count()
方法之后,之前不会打印。
如果没有图形,堆栈很难可视化,但是:
...Count(3)
... Count(2)
... Count(1)
... Count(0)
... ResumeCount(1)
... ResumeCount(2)
... ResumeCount(3)
每次再次调用Count时,当前方法的处理将停止,直到后续调用返回。
流程如下所示:
在调试器中走一遍,你会看到......
如果您在Count调用之前移动ConsoleWriteLine调用,那么您将拥有3,2,1而不是1,2,3