这个递归函数困惑我,发生了什么?

时间:2010-04-06 22:04:41

标签: c recursion

我正在玩递归并完成这个简单的功能。我假设它会打印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;
}

6 个答案:

答案 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 />
}

注意,这可以使用函数指针进行扩展。