我正在玩递归并完成这个简单的功能.我假设它会打印9-0到stdout,但是,它打印0-9.我看不出这是怎么回事.
int main()
{
rec(10);
return 0;
}
int rec(int n){
if(n > 0)
printf("%d\n", rec(n -1));
return n;
}
Run Code Online (Sandbox Code Playgroud)
Cha*_*ion 11
想想这样.
rec(10)
rec(9)
rec(8)
rec(7)
rec(6)
rec(5)
rec(4)
rec(3)
rec(2)
rec(1)
rec(0)
Run Code Online (Sandbox Code Playgroud)
开始放松
printf("%d\n", 0);
printf("%d\n", 1);
printf("%d\n", 2);
printf("%d\n", 3);
printf("%d\n", 4);
printf("%d\n", 5);
printf("%d\n", 6);
printf("%d\n", 7);
printf("%d\n", 8);
printf("%d\n", 9);
Run Code Online (Sandbox Code Playgroud)
Lie*_*yan 10
让我们像这样重写你的代码:
int rec(int n){
if(n > 0)
{
int retval = rec(n -1);
printf("%d\n", retval);
}
return n;
}
Run Code Online (Sandbox Code Playgroud)
它是否清楚为什么在9之前首先打印0?
小智 9
正如迈克尔·伯尔在评论中所说,如果你想看看发生了什么,请启用调试符号进行编译,如下所示:
gcc -o test -g test.c
Run Code Online (Sandbox Code Playgroud)
然后像这样运行gdb.
gdb test
Run Code Online (Sandbox Code Playgroud)
然后,为了开始,输入
start
Run Code Online (Sandbox Code Playgroud)
哪个在主函数的第一次调用时中断.类型
step
Run Code Online (Sandbox Code Playgroud)
到达代码中的下一行,然后按Enter键继续重复上一个命令.如果你很开心,请输入continue
以停止踩踏.您将在每个阶段看到值和评估线,以确认上述答案.
希望能提供一些有用的信息.