我正在玩递归并完成这个简单的功能。我假设它会打印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;
}
答案 0 :(得分:19)
rec
行上的printf
函数在printf
之前进行评估。因此rec
函数的最深实例首先打印 。
答案 1 :(得分:11)
这样想。
rec(10)
rec(9)
rec(8)
rec(7)
rec(6)
rec(5)
rec(4)
rec(3)
rec(2)
rec(1)
rec(0)
开始展开
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);
答案 2 :(得分:10)
让我们重写你的代码:
int rec(int n){
if(n > 0)
{
int retval = rec(n -1);
printf("%d\n", retval);
}
return n;
}
是否明确为什么0在9之前首先打印?
答案 3 :(得分:9)
正如Michael Burr在评论中所说,如果你想看看发生了什么,请启用调试符号进行编译,如下所示:
gcc -o test -g test.c
然后像这样运行gdb。
gdb test
然后,为了开始,输入
start
在main函数的第一次调用时中断。型
step
到达代码中的下一行,然后按Enter键继续重复上一个命令。如果您满意,请输入continue
以停止踩踏。您将在每个阶段看到值和评估线,以确认上述答案。
希望提供一些有用的信息。
答案 4 :(得分:3)
因为您正在创建9个环境9 > 8 > 7 > 6 > 5 > 4> 3 > 2 > 1 > 0
,所以这些环境的处理方式与a(b(c(d(e(f(g()))))))
相同,从最深的环境到第一个环境。
请记住,当你执行此操作printf("%d",n(m));
时,你实际上并没有打印任何内容,而是说“打印n(m)的结果”然后当它试图解析你正在调用的n(m)时另一个打印并再次说“解决n(m-1)”。
现在,当你到达n(0)时,它将返回0,以便在printf
的最后一次调用时打印,因此它打印0然后是1 .. 9。
答案 5 :(得分:0)
int main()
{
rec(10);
return 0;
}
int rec(int n){
if(n > 0)
printf("%d\n", rec(n -1));
return n;
}
一般来说,考虑一些代码。我们说迭代和递归解决方案之间存在直接关系,因此任何解决方案都可以迭代编写,反之亦然。但是,在某些情况下,可以更容易地递归地表达算法(例如,河内的塔。)在上面的代码的情况下,等价物将是for循环结构。
这可以通过以下函数实现:
void _for(int i, int n)
{
if( i >= n ) return; // TERMINAL<br />
// some expression (ie. printf("%d\n",i);)<br />
_for(i+1,n) // RECURSION<br />
}
注意,这可以使用函数指针进行扩展。