4までの自然数の和を求めるために、4を引数にしてこの関数を呼んだとすると、
4を引数に呼ばれたcalc関数は
n=4から始まります。
4は1より大きいのでif文にはいります。
int calc(int n){
if (n > 1) return(n + calc(n - 1));
else return 1;
}
ここで
return (4+calc(3)); ☆1
となってまたcalc関数が呼ばれます。
n=3となりcalc関数が始まります。
3は1より大きいのでまたif文に入り、
return (3+calc(2)); ☆2
となってまたcalc関数が呼ばれます。
n=2となりcalc関数が始まります。
2は1より大きいのでまたif文に入り、
return (2+calc(1)); ☆3
となってまたcalc関数が呼ばれます。
n=1となり、calc関数が始まります。
1は1より大きくないのでelseに入ります。return 1より1が帰ります。
関数は呼んだところにかえりますから
この関数が最後に呼ばれたところは☆3ですから
return (2+calc(1));
のcalc(1)の部分が1になりますね。
つまりreturn (2+1);で「3」が返ります。★2
この関数が最後から2番目に呼ばれたところは☆2ですから
return (3+calc(2));
のうち、さきほど★2からcalc(2)は「3」であることがわかったので、
☆2の返り値は結局return (3+3)つまり「6」になります。★1
この関数が最後から3番目に呼ばれたところは☆1でした。
return (4+calc(3));
このうちcalc(3)は★1より「6」でしたから
return (4+6)となり結局10です。
この関数が呼ばれたのは最初ですから、最終的に呼ばれたところに返る値は「10」です。
つまり4+3+2+1の計算が出来たことになります。
しかし、こんな風に処理を追ってたんじゃ、面倒でしかたありません。
そこでソースを見直すと、定義通りに式を書けば、すんなりそのまま処理が行われていることがわかります。
int calc(int n){
if (n > 1) return(n + calc(n - 1));
else return 1;
}
自然数の和は1よりも大きな数がある時、その一つ下の値を足し合わせていった数字です。
式を書けば、アルゴリズムを追わなくても、勝手に計算をやってくれる。
それが再帰関数の利点です。
では、階乗を求めるには?
自然数を求めるためにはこのように書きました。
******自然数の和*******
int calc(int n){
if (n > 1) return(n + calc(n - 1));
else return 1;
}
自然数の和は1よりも大きな数がある時、その一つ下の値を足し合わせていった数字です。
******階乗計算*********
int calc(int n){
if ****;
else ****;
}
階乗は0よりも大きな数がある時、その1つ下の値とかけあわせていった数字です。
このように比べたらどのように変更を加えたらいいかわかりますね。