2016-11-10 15 views
1

プログラムが関数再帰についてです、プログラム全体の制御C言語の再帰制御

void count(int n) 
{ 
    static int d=1; 
    printf("%d",n); 
    printf("%d",d); 
    d++; 
    if(n>1) 
    count(n-1); 
    printf("%d",d); 
} 

void main() 
{ 
    count(3); 
} 

は私の予想出力は

3122134 

オリジナル出力は

312213444 
である方法を知っておく必要があります

余分な2つの4がどのように出力されたか説明してください。

このプログラムに関するフロー制御について説明してください。

+0

を呼び出すことを忘れないでください。count(1)をチェックしてcount(2)とcount(3)をチェックした後に戻りますか? – mvs

+4

デバッガを使用して、 、そして再帰呼び出しにステップインします。 –

+0

@mvsこの関数は、nが3,2、および1に等しいときにそれ自身を呼び出し、各呼び出しに対して、最後のステートメントでdを出力します。だから出力の末尾に444を得ます。 –

答えて

3

ここでは、この問題が発生した理由を理解するのに役立つフレンドリー描画(あなたが関数内d++をやって、変数static int dを更新するためにstaticは問題ではありません)です:あなたが内部の再帰を呼び出すと enter image description here

関数count(2)が起動しますが、count(3)は破棄されません。サブファンクションcount(2)が終了するのを待っているだけです。これが起こると、count(3)が目を覚まして「ああ、ついに!私の娘count(2)が終了したので、今度は終了する」と言います。しかし、count(2)の内部ではcount(1) ...

+1

素敵なドローイング!非常に理解しやすい。 –

関連する問題