2016-12-09 3 views
0

私はちょうどC++プログラミングを開始しましたが、再帰関数がどのように機能するかを示すために使用された特定のプログラムにちょっと残っています。私は再帰関数の前提を知っています、それは終了条件が満たされるまでそれ自身を呼び出す関数です。C++(初心者レベル)の再帰関数について

上記のコードでは、if文が終了条件になっています。 http://www.cprogramming.com/tutorial/lesson16.html

特にこのコード:

は、しかし、私を倒してしまったコードは、このリンクからだった直後に上記のコードで

#include <iostream> 
using namespace std; 

void printnum (int begin) 
{ 
    cout<< begin<<endl; 
    if (begin < 9)   // The base case is when begin is greater than 9 
    {       // for it will not recurse after the if-statement 
     printnum (begin + 1); 
    } 
    cout<< begin<<endl;   // Outputs the second begin, after the program has 
           // gone through and output 
} 
int main() 
{ 
    printnum(1); 
    return 0; 
} 

OP: 
1 
2 
3 
4 
5 
6 
7 
8 
9 
9 
8 
7 
6 
5 
4 
3 
2 
1 

、私は最初の9までの出力を理解しかし、その後、ifループに続くcout文が、printvalueが最初に呼び出されたときの値に元の値に達するまで、begin変数のカウントを開始させるのはなぜですか?私はここで出口の状態を本当に理解していないと思います。

私が紛失していることがわかりません。何か助けていただければ幸いです。

ありがとうございました。

+1

。 –

+0

これは、*と*を呼び出す前に印刷するためです。これは '1'を出力します...'その他の呼び出し '...' 1'など – Boiethios

+1

デバッガを使ってコードを1行ずつ進めて、再帰呼び出しに入ります。それはあなたに何が起こっているかを知るかもしれません。 –

答えて

0

したがって、printnum(1)が呼び出されるとどうなるか見てみましょう。 begin1と等しく、coutと表示され、次にprintnum(2)と表示されます。 しかし、プログラムでprintnum(2)が機能するときはどうなりますか?それはprintnum(2)が呼ばれた場所からprintnum(1)を実行し続けます。したがって、実行する次の行はcout << beginです。 beginはまだと等しく、printnum(1)関数を実行しているためです。このため、末尾に1がもう一度印刷されます。状況は他の関数呼び出しとまったく同じです。 たとえば、printnum(9)が呼び出されると、9が出力され、ifのチェックが失敗します(beginは9より小さくはない)。次に9が再度印刷されます。

1

beginはユニークで、現在のアクティブな機能に属します。値は決して変更されません。

再帰関数は他の関数とまったく同じように動作します。別のパラメータの名前が何であるかは問題ではありません。

あなたはこれらを持っていた場合:

void f(int x); 

void g(int x) 
{ 
    cout << x << endl; 
    f(x+1); 
    cout << x << endl; 
} 

g、2つの異なる番号を印刷した場合、あなたは(私は願って)非常に驚くだろう。

あなたの再帰は、まさにこのように動作しますパラメータで代わりに再帰のユニークな機能を使用しています(はるかに小さい)例:

void printnum_3() 
{ 
    cout << 3 << endl; 
    cout << 3 << endl; 
} 

void printnum_2() 
{ 
    cout << 2 << endl; 
    printnum_3(); 
    cout << 2 << endl; 
} 

void printnum_1() 
{ 
    cout << 1 << endl; 
    printnum_2(); 
    cout << 1 << endl; 
} 

int main() 
{ 
    printnum_1(); 
} 
0

理由はcout文があればループを開始し始め変数を引き起こす以下のんprintvalueが最初に呼び出されたときに元の値に達するまで後方に数えますか?

先頭にはループなしがあります。あなたが理解する必要のあるコールスタックがあります。再帰呼び出しは、(begin < 9)falseになると、つまりbegin = 9になると停止します。コールスタックが巻き戻されています。

ファンクションの最初のcoutは、印刷順序[1..9]で、第2のcoutは、減少順序[9..1]を印刷しています。

あなたのコードの実行は、このようなものです:なぜならもし条件の後、COUTのだ

cout<< 1 <<endl; //enter1 
    cout<< 2 <<endl; //enter2 
    cout<< 3 <<endl; //enter3 
     ... 
     cout<< 8 <<endl; //enter8 
      cout<< 9 <<endl; //enter9 
      cout<< 9 <<endl; //exit9 
     cout<< 8 <<endl; //exit8 
     ... 
    cout<< 3 <<endl; //exit3 
    cout<< 2 <<endl; //exit2 
cout<< 1 <<endl; //exit1