(1) |
キーボードから整数を入力して,その階乗を表示するプログラムを2つ作成する.ひとつ は再帰関数を使わないで繰り返し文で計算するプログラム,もうひとつは再帰関数を使っ たプログラムである.[注意]これらの二つのプログラムはまでしか計算できない.以上は, 整数型の変数のサイズを越えるからである.
1 #include <stdio.h> 2 3 int kaijyo(int n); // プロトタイプ宣言 4 5 //========== メイン関数 ================================ 6 int main(void) 7 { 8 int nx, result; 9 10 scanf("%d", &nx); // 整数入力 11 result=kaijyo(nx); // 関数呼出し 12 printf("%d!=%d\n", nx, result); // 計算結果表示 13 14 return 0; 15 } 16 17 //========== 階乗を計算する関数(繰り返し文) =============== 18 int kaijyo(int n) 19 { 20 int i, p=1; 21 22 for(i=n; 1<=i; i--){ 23 p=p*i; 24 } 25 26 return p; 27 }
12 12!=479001600
1 #include <stdio.h> 2 3 int kaijyo(int n); // プロトタイプ宣言 4 5 //========== メイン関数 ================================ 6 int main(void) 7 { 8 int nx, result; 9 10 scanf("%d", &nx); // 整数入力 11 result=kaijyo(nx); // 関数呼出し 12 printf("%d!=%d\n", nx, result); // 計算結果表示 13 14 return 0; 15 } 16 17 //========== 階乗を計算する関数(再帰呼出し)=============== 18 int kaijyo(int n) 19 { 20 21 if(n==1){ 22 return 1; 23 }else{ 24 return n*kaijyo(n-1); 25 } 26 27 }
12 12!=479001600
(4) |
(5) |
分割統治法 [2]というアルゴリズムから再帰関数を 考えることもできる.問題を2つ以上の部分に分けて,それぞれを解く.そしてそれを合 わせたもの3が元の問題の 解となる場合である.分けられた問題は元の問題よりも小さくなり,さらに分割できる. そして,自明な解になるまで分割する方法である.先ほど示したの階乗の計算では, の計算との計算に問題を分けることができる.すなわち
(6) |
再帰関数を使うときに,再帰を終了させる条件を絶対に忘れてはならない.先ほどの階乗 の計算では,
if(n==1){ return 1; }
再帰関数は難しい概念であるが,非常に便利な場合がある.問題のときかたのアルゴリズ ムは分からないが,分割統治法あるいは漸化式が分かっている場合,解を求めるプログラ ムができてしまう.このような代表例が「ハノイの塔」と呼ばれるパズルである.これに ついては,ちょっとばかり難しいのでこの授業では取り上げないが,興味のある者は私のwebでも見よ.
単純な問題であれば繰り替えし文の方が良いが,複雑な問題となると再帰関数で記述はで きるが,繰り替えし文ではプログラムが大変困難な場合がある.先ほど少し述べた「ハノイ の塔」や後で学習する「クイックソート」の場合である.このような時には再帰関数を使 い,問題をあざやかに解くことができる.