我有一个名为的函数fun1(),用于递归.关于第一次打电话,我很困惑fun(--n);.它会做什么以及每个函数完成后我的堆栈如何弹出我的函数?
void fun(int n)
{
if(n>0)
{
fun(--n);
printf("%d",n);
fun(--n);
}
}
Run Code Online (Sandbox Code Playgroud)
我的主要功能如下:
int a;
a=3;
fun(a);
Run Code Online (Sandbox Code Playgroud)
我想知道执行的顺序以及我的堆栈在第一个函数调用之前,期间和之后包含的内容fun(--n).
它会打印出来 0120
(3->[2]->1)
+ +
| |
+------------+ +-------+
| |
({2}->[1]->0) ({1}->[0]->-1)
+ + +
| | |
+--------------+ +----+ |
| | +
| | (X)
+ +
({1}->[0]->-1) (0->X)
+ +
| |
+------------+ |
| |
| |
+ +
({0}->X) (X)
Run Code Online (Sandbox Code Playgroud)
以上是调用树的表示.读这样的:在第一个数字( ),包在{ }是该函数接收用于一个呼叫的值,下面的箭头的下一个数字表示被一个减小的值,并用它来再次调用.将[ ]其返回打印时表示.最后一个数字( )是用于第二次调用之后的值printf.An (X)表示它无法进入if块.在每个( )大括号结束时,函数返回到它起源的点(跟随行).请注意,在第一次调用返回后,将打印该值.