2017-05-15 18 views
0

これはループではないので、この関数はループしているような出力を出力するので、これは読んだ本の再帰関数です。 この機能の仕組みを理解しようとしましたup_and_downこの再帰関数を理解していない

本の中で私はそれを再帰関数は自己呼び出すと言うが、コード内ではそれを直接見ることができないと言っているのですか?

これは、機能の中で何が起こっているのかを前もって説明してください。

#include<stdio.h> 

void up_and_down(int); 
int main(void){ 
    up_and_down(1); 
    return 0; 

} 
void up_and_down(int n){ 

    printf("Level %d: n location %p\n" , n , &n); 
    if(n < 4){ 

    up_and_down(n+1); 
    } 
    printf("LEVEL %d: n location %p\n",n,&n); 
} 

出力

レベル1:nの位置0x7ffd8988c9fc

レベル2:N位置0x7ffd8988c9dc

レベル3:N位置0x7ffd8988c9bc

レベル4:N位置0x7ffd8988c99c

LEVEL 4:N位置0x7ffd8988c99c

レベル3:N位置0x7ffd8988c9bc

LEVEL 2:N位置0x7ffd8988c9dc

LEVEL 1:nの位置0x7ffd8988c9fc

+0

'up_and_down'の中に' up_and_down(n + 1)の呼び出しはありませんか? –

+0

あなたが理解していないのは正確には何ですか? –

+0

@AdrianoRepettiはい、それはまだですが、私はその仕事の仕方を通してそれを見ることができません。 – user7738839

答えて

1

up_and_down関数内で呼ばれています。このコンテキストはスタックに格納されます。初めて(すなわち:up_and_down(1))のためup_and_down()に入るの瞬間

次のコンテキストを持っている:

----------- 
| LEVEL 1 | 
----------- 

上記矩形がコールup_and_down(1)の内側にコンテキストを表します。

この関数が再帰的に呼び出される(つまり、:up_and_down(2))、コンテキストがある:up_and_down(3)):第三のコール(IE用

----------- 
| LEVEL 2 | 
----------- 
----------- 
| LEVEL 1 | 
----------- 

up_and_down(4)):

----------- 
| LEVEL 3 | 
----------- 
----------- 
| LEVEL 2 | 
----------- 
----------- 
| LEVEL 1 | 
----------- 

そしてそうでnが(すなわち、に等しくなるまで

----------- 
| LEVEL 4 | 
----------- 
----------- 
| LEVEL 3 | 
----------- 
----------- 
| LEVEL 2 | 
----------- 
----------- 
| LEVEL 1 | 
----------- 

if関数内のステートメントup_and_down()はevaです。 nがに等しいとき初めてfalseにルーテッドされました。 したがって、追加の再帰呼び出しは発生しません(つまり、up_and_down(5)というコールは実行されません)。 このため、n == 4と呼ばれ、この再帰関数の終了条件はです。

2番目のprintf()(つまり、LEVEL 4が表示されます)の実行フローが続きます。次に、第四の呼のコンテキストが破壊される:

----------- 
| LEVEL 3 | 
----------- 
----------- 
| LEVEL 2 | 
----------- 
----------- 
| LEVEL 1 | 
----------- 

制御フローはコールup_and_down(3)によって作成されたコンテキストと再帰関数で、つまり、呼び出しup_and_down(4)から戻るものである(すなわち:LEVEL 3これはあります表示される時刻)。

次のすべての手順は同様に行われます。

+0

名声。面倒だったのですが、OPが物事をもっと良く理解するのに役立ちます。 –

0
#include<stdio.h> 

void up_and_down(int); 
int main(void){ 
    up_and_down(1); 
    return 0; 

} 
void up_and_down(int n){ 

    printf("Level %d: n location %p\n" , n , &n); 
    if(n < 4){ 

    up_and_down(n+1); // HERE : the function calls itself 
    } 
    printf("LEVEL %d: n location %p\n",n,&n); 
} 

関数でありますメインでパラメータとして整数を使用して呼び出されます。メインn = 1から呼び出されると、関数(up_and_down)が実行され、最初にレベルと位置が出力されます。

n値は1と1 <です。4.それは条件に一致し、関数はパラメータとしてn + 1を使用して自身を呼び出します。再度関数を実行しますが、Nと= 2

nが4 をreachsとすることができますように、関数の実行は、関数の残りの部分(第2のprintf)

を呼び出し続けるまで、それはそれを行いますup_and_down参照は、再帰関数は、新しいコンテキスト呼ばれるたびに作成され、が最後の文脈の上にを積み上げ

+0

それは 'main'がそれを一度呼び出すと、関数は引数として新しい' n'を置くことによって自分自身を呼び出します。 – user7738839

+0

なぜメインコールそれはそれを自己と呼ぶ? – user7738839

+0

@ user7738839はい。この関数はメインで初めて呼び出され、次に新しい引数で関数自体から直接呼び出されます – RomMer

0
#include<stdio.h> 

void up_and_down(int); 
int main(void){ 
    up_and_down(1); --> Step 1 
    return 0; 

} 
void up_and_down(int n){ 

    printf("Level %d: n location %p\n" , n , &n); --> step 2 
    if(n < 4){    /* --> step3 checks if n is less than 4 */ 

    up_and_down(n+1); /*--> step 4(if step3 is true) when if condition true this is executed */ 
    } 
    printf("LEVEL %d: n location %p\n",n,&n); /* step5 irrespective of the if condition value of n is printed */ 
} 
0

あなたは部屋に通じるドアの前に立っていると想像してください。部屋にはまた、次の部屋につながるドアがあります。

ステップ1:隣の部屋を入力し

また、あなたは鉛筆とあなたがするための指示が含まれている一枚の紙を持っている想像してみてください。

ステップ2:紙の上に十字を描きます。

ステップ3:すべての十字を数え、大声で叫ぶ:「私は部屋番号[十字の数]を入力しました」。

ステップ4.1:あなたは以下の4つの十字架を数えた場合は、1

ステップ4.2に進みます:残す:あなたが4つの以上の十字架を数えた場合、5

ステップ5に進みます部屋。

ステップ6:用紙から十字を1つ消去します。

ステップ7:すべての十字架を数え、大声で叫ぶ:あなたはスタートに到達するときには、タスクを終了している「私は部屋番号[十字架の数]を残している」と5

に進みます。再び。

関連する問題