これは,実際にプログラムを示した方がよく分かるので,簡単な例を示す.数学で,演算子!で表される階乗という演算にしばしばお目にかかる.たとえば,5の階乗は
(1) |
ここで,整数を入力して,その階乗を計算するプログラムを作ってみよう.通常は,式 (2)の通りにプログラムを書くだろう.この式の通りにプログラムを 書くと,リスト3のようになる.
同じ計算を,式(3)と(4)に着目してプログ ラムを作ってみよう.すると,リスト4のようになる.このプログラム を見ると,漸化式をそのままプログラムしたことが分かるだろう.
リスト4のプログラムは,リスト3とは異なり, 関数内で自分自身を呼びだしている.このように,自分自身を呼び出すことを再帰呼び出 し(recursive call)と言う.C言語ではこのように自分自身を呼び出すことができる.
これまでの例で,再帰呼び出しは繰り返し文と似ていることが分かっただろう.繰り返し 文では,無限ループにならないように,必ず終了条件が必要であった.同じように,再帰 呼び出しでも,呼び出しの終了条件が絶対に必要である.そうしないと,無限に関数を呼 び出すことになり,いずれはプログラムがクラッシュするであろう.
もうひとつ重要なことは,再帰呼び出しが出きるようなアルゴリズムを考えなくてはなら
ない.一つの考え方は,漸化式を書いてみることである.数学の漸化式のような考え方が
できれば,それを忠実にプログラムすれば,再帰呼び出しができるであろう.
1 #include <stdio.h> 2 3 /*=====================================================*/ 4 /* 階乗を計算する関数 */ 5 /*=====================================================*/ 6 int kaijyo(int n){ 7 int i, value; 8 9 value=1; 10 11 for(i=n; i>=1; i--){ 12 value*=i; 13 } 14 15 return value; 16 17 } 18 19 /*=====================================================*/ 20 /* メイン関数 */ 21 /*=====================================================*/ 22 int main(){ 23 int n; 24 25 printf("階乗を計算します.値を入れてください\n"); 26 scanf("%d",&n); 27 28 printf("%d!=%d\n",n,kaijyo(n)); 29 30 return 0; 31 }
1 #include <stdio.h> 2 3 /*=====================================================*/ 4 /* 階乗を計算する関数 */ 5 /*=====================================================*/ 6 int kaijyo(int n){ 7 8 if(n==0){ 9 return 1; 10 }else{ 11 return n*kaijyo(n-1); 12 } 13 14 } 15 16 /*=====================================================*/ 17 /* メイン関数 */ 18 /*=====================================================*/ 19 int main(){ 20 int n; 21 22 printf("階乗を計算します.値を入れてください\n"); 23 scanf("%d",&n); 24 25 printf("%d!=%d\n",n,kaijyo(n)); 26 27 return 0; 28 }
=0pt =0.4pt |