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) 

バックトレースは歴史全体を物語っています。カウントするすべての呼び出しが「スタック」されていることを確認してください。しかし、誰も戻ってこなかった。そして、まだ何も印刷されていません。

今、彼らがどのように1つずつ戻ったかを見てください:

(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

A program can be transformed by replacing things with their equivalents: variables with their values, function calls with the code of the function, conditionals on constants with selected code. e.g.,

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に達するまで1を減算します。再帰の詳細については、こちらをご覧ください(階乗の例を使用すると、理解できます):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呼び出して残りの値を出力します。county

別の例、これ:

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 に答える