0

这是一个递归程序。但我不明白在这个节目中发生的事件顺序

#include<stdio.h>
count(int);
main() 
{
    int x=5;
    count(x);
}
count(int y)
{
    if(y>0)
    {
        count(--y);
        printf("%d ",y);
    }
}

输出是:

4 3 2 1 0 ...

但是我不明白第一次count(5)被调用和 count(4) 被调用时会发生什么。控件是否立即转到函数的开头?还是首先打印 的值,y然后再转到函数的开头count()

4

5 回答 5

5

它就像一堆盘子。

 1       2         3         4          5
                                      count(0)
                            count(1)  count(1)
                  count(2)  count(2)  count(2)
        count(3)  count(3)  count(3)  count(3)
main    main      main      main      main


count(0) prints nothing

转到第 4 步

count(1) prints 1

转到第 3 步

count(2) prints 2 ...

因此,要获得输出,4 3 2 1您需要交换count(--y)printf("%d",y)行。

于 2012-08-02T09:27:34.650 回答
2

您可以轻松地单步执行代码以查看那里发生了什么,使用稍微编辑的代码:

#include<stdio.h>

void count(int);

int main() 
{
    int x=5;
    count(x);
}
void count(int y)
{
    if(y>0)
    {
        count(--y);
        printf("%d ",y);
    }
}

现在看看执行期间会发生什么。查看 gdb 会话:

(gdb) b count
Breakpoint 2 at 0x4004ea: file rc.c, line 10.
(gdb) c
Continuing.

Breakpoint 2, count (y=5) at rc.c:10
(gdb) c
Continuing.

Breakpoint 2, count (y=4) at rc.c:10
(gdb) c
Continuing.

Breakpoint 2, count (y=3) at rc.c:10
(gdb) c
Continuing.

Breakpoint 2, count (y=2) at rc.c:10
(gdb) c
Continuing.

Breakpoint 2, count (y=1) at rc.c:10
(gdb) c
Continuing.

Breakpoint 2, count (y=0) at rc.c:10
(gdb) bt
#0  count (y=0) at rc.c:10
#1  0x00000000004004fe in count (y=0) at rc.c:12
#2  0x00000000004004fe in count (y=1) at rc.c:12
#3  0x00000000004004fe in count (y=2) at rc.c:12
#4  0x00000000004004fe in count (y=3) at rc.c:12
#5  0x00000000004004fe in count (y=4) at rc.c:12
#6  0x00000000004004dd in main () at rc.c:6
(gdb) 

后面的痕迹讲述了整个历史。看到每个对 count 的调用都是“堆叠的”。但没有人回来。还没有打印任何东西。

现在看看他们是如何一一返回的:

(gdb) n
count (y=0) at rc.c:13 /* count(y = 0) returned first , it will not cause any printing*/
(gdb) n
(gdb) n
count (y=1) at rc.c:13 /* count(y = 1) returned second, this will cause printing 0 */
(gdb) n
(gdb) n
count (y=2) at rc.c:13 /* subsequent returns will cause printing of 1,2,3 etc */
(gdb) n
(gdb) n
count (y=3) at rc.c:13
(gdb) n
(gdb) n
count (y=4) at rc.c:13
(gdb) c
Continuing.
0 1 2 3 4 
于 2012-08-02T09:44:51.993 回答
0

可以通过用它们的等价物替换事物来转换程序:用它们的值替换变量,用函数代码替换函数调用,用选定代码替换常量的条件。例如,

main() 
{
    int x=5;
    count(x);
}

-->

main() 
{
    count(5);
}

-->

main() 
{
    if(5>0)
    {
        count(4);
        printf("%d ",4);
    }
}

-->

main() 
{
    count(4);
    printf("%d ",4);
}

-->

main() 
{
    if(4>0)
    {
        count(3);
        printf("%d ",3);
    }
    printf("%d ",4);
}

-->

main() 
{
    count(3);
    printf("%d ",3);
    printf("%d ",4);
}

--> ... -->

main() 
{
    count(0);
    printf("%d ",0);
    printf("%d ",1);
    printf("%d ",2);
    printf("%d ",3);
    printf("%d ",4);
}

-->

main() 
{
    if(0>0)
    {
        count(-1);
        printf("%d ",-1);
    }
    printf("%d ",0);
    printf("%d ",1);
    printf("%d ",2);
    printf("%d ",3);
    printf("%d ",4);
}

-->

main() 
{
    printf("%d ",0);
    printf("%d ",1);
    printf("%d ",2);
    printf("%d ",3);
    printf("%d ",4);
}
于 2012-09-24T04:31:33.143 回答
0

嗯,这就像一个算术级数。从N > 0 开始,每次减一直到达到 0。更多关于递归的信息(使用阶乘示例,你就会明白): http ://en.wikipedia.org/wiki/Recursion

希望这有帮助。

问候。

于 2012-08-02T09:23:16.097 回答
0
void count(int y)
{
    if(y>0)
    {
        printf("%d ",--y);
        count(y);
    }
}

打印 y-1, y-2, ... 0。

如果y <= 0,则无事可做。如果y > 0,它递减y打印递减的值,y然后count用递减的值调用y以打印剩余的值。

另一个例子,这个:

void count(int y)
{
    if(y>0)
    {
        printf("%d ",--y);
        count(y);
        printf("amol");
    }
}

打印 y-1, y-2, ... 0 amol...amol (y 次)。

它通过打印 y-1 来实现,然后递归调用count(y-1)打印 y-2、..0、amol(y-1 次),然后打印剩余的“amol”。

于 2012-08-02T09:37:45.060 回答