-3

重複の可能性:
再帰とは実際には何であり、このプログラムの出力を説明していますか?
このコードで実際に何が起こっているのでしょうか?

わからない再帰関数があります。コードが有効かどうかさえわかりません:

int count(int x) // suppose x is 3
{
  if(x>0)
  {
    count(--x);
    printf(x);
    count(--x);  // control reaches here or not?
  }
}

これは単なる擬似コードです。初期変数を3とします。スタックの概念をコンテキストで説明してください。このコードは何日も私を混乱させており、私はこのコードの答えを本当に見つけることができません。

4

2 に答える 2

2

わかりました、ちょっと脳を目覚めさせる必要があったからです :-)

count(3)関数に入り、呼び出しますcount(2)(2: レベル 2)。
count(2)関数に入り、呼び出しますcount(1)(3: 第 3 レベル)。
count(1)関数に入り、呼び出しますcount(0)(4: レベル)。
count(0)関数に入りますが、 false であるため何もせず、まだ 0x>0である第 4 レベルに戻ります。x

4: レベルが出力さ0れ、呼び出されますcount(-1)(5: レベル)

count(-1)関数に入りますが、は false であるため、何もせず、まだ -1x>0である第 4 レベルに戻ります。4:th レベルは、まだ 1 である 3:rd レベルに戻ります。x
x

3: 第 3 レベルは出力1して呼び出しますcount(0)(第 4 レベル)

count(0)関数に入りますが、x>0false であるため、何もせず、xまだ 0である
第 3 レベルに戻ります。第 3 レベルは、まだ 2 である第 2 レベルに戻りますx

2: 第 2 レベルは出力2して呼び出しますcount(1)(第 3 レベル)

count(1)関数に入り、呼び出しますcount(0)(4: レベル)。
count(0)関数に入りますが、 false であるため何もせず、まだ 0 x>0である第 3 レベルに戻ります。x

3: 第 3 レベルは出力0して呼び出しますcount(-1)(第 4 レベル)

count(-1)関数に入りますが、は false であるため、何もせず、まだ -1 x>0である 3:rd レベルに戻ります。x

3:rd レベルは、xまだ 1 である
2:nd レベルに戻ります。2:nd レベルは、1:st レベルに戻り、完了です。

出力は0 1 2 0です。

これを本当に理解したい場合は、count(4) で試してみることをお勧めします。

于 2012-09-06T19:08:06.230 に答える
0

この関数は何も返しません。ここ数日で、この質問が疑わしい回数ここに投稿されているのを見てきました。理解に役立つコメント付きの実用的なコードを次に示します。

/*function declaration so that the program can utilize it*/
int count(int x);

/*main routine that calls the function*/
int main(void)
{
    count(3);    //call the function
    return 0;
}      

/*function prototype*/
int count(int x)
{
    if(x > 0)
    {
         printf("%d", x - 1); //print the value of x - 1 to the screen 
         return count(--x);   //Have the function call itself again with a new argument (the value of x after being decremented)
    }
    return x;                 //x is no longer greater than 0 so return it's value
}

この例での の使用に注意してください。returnまた、何をするかについても読んでくださいreturn。これは修正されたコードの一部です。(私の意見では) 再帰関数が何をしているのかを理解する最善の方法は、紙に書き出すことです。

于 2012-09-06T18:48:40.650 に答える