| (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でも見よ.
単純な問題であれば繰り替えし文の方が良いが,複雑な問題となると再帰関数で記述はで きるが,繰り替えし文ではプログラムが大変困難な場合がある.先ほど少し述べた「ハノイ の塔」や後で学習する「クイックソート」の場合である.このような時には再帰関数を使 い,問題をあざやかに解くことができる.