第14講 関数の再帰的呼び出し
第3話 1から3までの和

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

実行結果
c++

解説
??? 皆さんの頭の中はこんなところではないでしょうか。
特に、if(i+1<4)w=f(i+1,w);が余りも謎というところでないでしょうか。
その解説に入る前に、
w+=i; について解説しておきましょう。
注釈文にも書いてあるとおり、w=w+i;の簡略表現です。
簡略に表現できるこれがC言語やC++の特徴なのです。
   int i,w;
   i=1;
   w=0;
の3行も
   int i=1,w=0;
の1行で済ますこともできます。
つまり、宣言と初期化(最初の値の代入)が同時にできてしまうのです。
今まで使用してこなかったのは、
簡略表現にはタイピングが簡単に済むという利点とともに、
プログラムがわかりにくくなるという短所もあるからです。
私は、わかりやすさ優先から行き過ぎた簡略表現はすべきでないと考えています。
わかりやすくプログラミングをするが、構造プログラミングの神髄でしたよね。

さて、最大の謎w=f(i+1,w);を解説しましょう。
もしi+1の部分がないとすれば、w=f(w)ということになります。
実際、iの方をグローバル変数にしてコードを書きなしてみましょう。
#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);
}
w=f(w);になり、結果も同じc++です。
それでもw=f(w);ってどういうことでしょう。
意味不明ですよね。
ですが、実はw←f(w)であったことを思い出していただければ、
その意味不明の度合いはかなり減るのではないでしょうか。
a=a+1は、aに1を加えそれを改めてaの値のしなさいという意味でした。
w=f(w)もwを関数で加工して、それをあらためてwの値にしなさいという意味です。
例えば、f(x)=2x-3なら
fの働きは、xに対してxを2倍してそこから3を引くという、加工を加えることでした。
ですから、w=f(w)がwを加工してそれを改めてwの値にしなさいという意味です。

トレースは次話で。





第2話へ 第4話へ

戻る

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

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