第14講 関数の再帰的呼び出し
第4話 1から3までの和のプログラムのトレース

コード再掲
#include<iostream>
using namespace std;
int f(int w);
int i;
int main(){
   i=0;
   cout<<"1から3までの和:"<<f(0)<<endl;
}
int f(int w){
   i++;
   w+=i; //w=w+i;の簡略表現
   if(i+1<4)w=f(w);
   return(w);
}

トレース
   cout<<"1から3までの和:"<<f(0)<<endl;
でw=0の条件の下関数fが呼び出されます。
   i++;
   w+=i; //w=w+i;の簡略表現
によって、
i=1、w=1
次に
   if(i+1<4)w=f(w);
i=1ですから、w=1の条件の下関数fが呼び出されます。
次に、
   i++;
によって、i=2となり
   w+=i; //w=w+i;の簡略表現
からw=1+2=3となります。
i=2ですから、
   if(i+1<4)w=f(w);
if文が実行されますがw=3ですのでw=f(3)です。
すると、
   i++;
によって、i=3となり
   w+=i; //w=w+i;の簡略表現
からw=3+3=6となり、
なります。

今の動きを図式的に表すと
int f(0){
   i=0+1;
   w=0+1;
   if(1+1<4)w=f(1);

    int f(1){
      i=1+1;
      w=1+2;

      if(2+1<4)w=f(3);
       int f(3){
          i=2+1;
          w=3+3;
          if(3+1<4)w=f(4);//実行されない
          return(6);//w=6です。
        }
        return(6);//w=6です。  ①
  
      
      return(6);//w=6です。   ②
    }

   return(6);   ③
}
色を分け段組を付けたのは、同じfでも次元が違うことを示すためです。
処理の順番は上から順行われます。
return(w);の順番に注目してください。
ピンクの次元のreturn(w);が一番最初に行われ
薄紺色のreturn(w);が一番が一番最後に行われるのです。
次元の違いという説明に皆さんは?を思い浮かべてますよね。
大丈夫です。
第15講で順列作成のプログラムを関数の再帰的呼び出しを使って組むことになっています。
順列の作成のプログラム解説を読めば、次元の意味が明瞭になります。

さて、このプログラム少しいじると
1+2+3+・・・+100も計算できるようになります。どうしたらよいですか。
また、100までの和ということで
   cout<<"1から100までの和:"<<f(100)<<endl;
とできれば、いくつまでの和ということがわかります。
どのようにプログラムコードを変更すればよいでしょう。
また、説明のためにグローバル変数にしましたが、
ローカル変数版のプログラムも組んでみてください。

第3話へ 第5話へ

戻る

C言語 C++講義第1部へ
VB講義へ
VB講義基礎へ

vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)