第9講 関数の再帰的使用
第1話 関数の再帰的使用とは?

関数は、実は自分を呼び出すことができます。.
例えば、次のようなコード組んでみて下さい。
#include<iostream>
using namespace std;
void f(char n);
void main(){
   f(0);
}
void f(char n){
   cout<<n+1<<"回目のf"<<endl;
   if(n+1<10)f(n+1);
}

すると実行結果は、

これが関数の再帰的使用です。
自分が自分に仕事を依頼するのが
関数の再帰的使用です。
このプログラムは、
#include<iostream>
using namespace std;
void f(char n);
void main(){
   for(char i=0;i<10;i++)f(i);
}
void f(char n){
   cout<<n+1<<"回目のf"<<endl;
}
また、
#include<iostream>
using namespace std;
void main(){
   for(char i=0;i<10;i++)cout<<i+1<<"回目のf"<<endl;
}
つまり、再帰的使用でfor文と同様なことができるのです。
例えば、1から10まで加えていくプログラムは次のようにして可能です。
#include<iostream>
using namespace std;
int f(int n);
void main(){
   cout<<"1から10までの和は"<<f(10)<<endl;
}
int f(int n){
   if(n==0)return(0);
   n=n+f(n-1);
   return(n);
}

どうして???・・・
ですよね。
このプログラムは、nが0になるまで値が返されません。
つまり、
f(10)→f(9)→f(8)→f(7)→f(6)→
f(5)→f(4)→f(3)→f(2)→f(1)→f(0)
と進んでいくことになります。
そして、f(0)のとき、
   if(n==0)return(0);
によって、はじめて0の値がf(0)からf(1)に返されます。
f(1)の
   n=n+f(n-1);
はn=1ですから、
   n=1+f(0);
でf(0)は0ですから、
   n=1+0;
でnの値は1となります。
その値1は、
   return(n);
によって
f(2)に返されます。
f(2)の
   n=n+f(n-1);
はn=2でf(1)は1ですから、
   n=2+1;
からn=3となり、その値3が
   return(n);
によって
f(3)に返されます。
f(3)の
   n=n+f(n-1);
はn=3でf(2)は3ですから、
   n=3+3;
からn=6となり、その値6が
   return(n);
によって
f(4)に返されます。
f(4)の
   n=n+f(n-1);
はn=4でf(3)は6ですから、
   n=4+6;
からn=10となり、その値10が
   return(n);
によって
f(5)に返されます。
f(5)の
   n=n+f(n-1);
はn=5でf(4)は10ですから、
   n=5+10;
からn=15となり、その値15が
   return(n);
によって
f(6)に返されます。
f(6)の
   n=n+f(n-1);
はn=6でf(5)は15ですから、
   n=6+15;
からn=21となり、その値21が
   return(n);
によって
f(7)に返されます。
f(7)の
   n=n+f(n-1);
はn=7でf(1)は21ですから、
   n=7+21;
からn=28となり、その値28が
   return(n);
によって
f(8)に返されます。
f(8)の
   n=n+f(n-1);
はn=8でf(7)は28ですから、
   n=8+28;
からn=36となり、その値36が
   return(n);
によって
f(9)に返されます。
f(9)の
   n=n+f(n-1);
はn=9でf(8)は36ですから、
   n=9+36;
からn=45となり、その値45が
   return(n);
によって
f(10)に返されます。
f(10)の
   n=n+f(n-1);
はn=10でf(9)は45ですから、
   n=10+45;
からn=55となり、その値55が
   return(n);
によって
mainに返されます。
f(0)→f(1)→f(2)→f(3)→f(4)→
f(5)→f(6)→f(7)→f(8)→f(9)→f(10)→main
動きを返される値の観点からいうと
0→1+0→2+
1→3+3→4+6→
5+10→6+15→7+21→
8+28→9+36→10+45→main
上の1は0+1の計算結果ですし、3は2+1すなわち2+1+0等ですから、
計算過程を示せば
0→1+0→2+1+0→3+2+1+0→4+3+2+1+0→
5+4+3+2+1+0→6+5+4+3+2+1+0→7+6+5+4+3+2+1+0→
8+7+6+5+4+3+2+1+0→9+8+7+6+5+4+3+2+1+0→
10+9+8+7+6+5+4+3+2+1+0→main
です。結局0から10までの和
すなわち1から10までの和がmainに
返されていることが分かります。

では、これを参考にして
n!=n×(n-1)×(n-2)×・・・×3×2×1
を求めるプログラムを
関数の再帰的使用で実現して下さい。
nの値は、キーボードから入力することにします。




第8講第10話へ 第2話へ

a

魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ