再帰型プログラム
下のプログラムは、再帰型プログラムはないのですか。僕は、再起型プログラムというのを自分自身を使って自分自身を返すものだと思うのですが、違うのでしょうか。
/*3. 1から1000までの総和*/
#include<stdio.h>
main()
{
int i,sum=0;
for(i=1;i<=1000;i++)
sum=sum+i;
}
printf("1から1000までの総和=%d\n",sum);
return(0);
}
違います。再帰というのは関数の呼び出しに関するものと理解して下さい。
数学で言うと漸化式に当たります。
例えば階乗n!は1からnまで順に掛けたものだと定義されますが、これを
n! = (n-1)! * n
と捉えることができます。この式には、仮にn!が(関数の形で)定義されて
いるなら、n!を計算するのに直接計算せず、(n-1)!を計算して、その結果に
nを掛ければ答が出ることを示しています。
ある計算をするプログラムのまとまりをc言語で関数と呼びます。
今仮に階乗を計算する関数をkaijo(n)と表します。
c言語では、プログラムの中に関数を書くと、それが呼び出され答えが返ります。
例えば
n = 10;
kotae = kaijo(n);
とすれば、kotaeに10!が得られるようにできます。
この呼ばれる側のkaijoのプログラムが一番肝心のところです。
これを
ans = 1;
for(i =1; i <= n; i++){
ans = ans * i;
}
としては再帰とは言わないのです。自分をきめるのに自分自身を使うというのが再帰の考えです。
となると、
ans = kaijo(n-1) * n;
がkaijoの心臓部となります。もし、nなる値でkaijoが呼ばれたら、n-1でまた
kaijoを呼び出します。そうしたら、プログラムは自然にn-2でkaijoを呼び出します。
これがずっとくり返されます。このままだと、nの値がどんどん小さくなって、最後は
-∞になってしまいます。c言語では-∞は表せないので、プログラムは暴走し、答えも得られません。
そこで、1!=1と定義しておくのです。kaijoのプログラムの最初にこの条件をみたしているか調べ、そうなら答として1を返すようにするのです。
この課題をやるには、再帰については以上のヒントで十分なはずです。ただし、
関数の呼び出しと関数の書き方についての知識は必要です。c言語の教科書的なもの
(図書館にあります。配った資料に紹介してある本も参考になります)を参考にして
ください。
デバッガの使い方を覚えて、再帰のプログラムをデバッガのもとに動かして
みると理解が一層深まります。
質問・連絡は oshima%kaiyodai.ac.jpまで