第10講 社員が自分に命令することを繰り返す(関数の再帰的使用)
第3話 なぜ1から10までの和が計算できるの?
プログラムの文章
#include<stdio.h>
int f(char i);
int main(){
printf("1+2+3+4+5+6+7+8+9+10=%d\n",f(10));
}
int f(char i){
int w;
if(i-1>=0){
w=i+f(i-1);
}
else{
return(0);
}
return(w);
}
実行結果
さて、上のプログラムでどうして
1+2+3+4+5+6+7+8+9+10
が計算できるのでしょうか。
1からnまで和をn#と表すことにしましょう。
つまり、3#や10#で
3#=1+2+3
10#=1+2+3+4+5+6+7+8+9+10
を表すものと約束します。
printf("1+2+3+4+5+6+7+8+9+10=%d\n",f(10));
のf(10)で10#とは何かと関数fに聞きます。
すると、fはi + f(i - 1)すなわち10+9#であると答えます。
では、9#とは何かとf(i - 1)によって、fがfに尋ねます。
すると、するとfは i + f(i - 1)によってその答えは9+8#であると答えます。
では、8#とな何かとfがfに尋ねると、
fはi + f(i - 1)によってその答えは8+7#であると答えます。
以下同様にしていって
7#は7+6#
6#は6+5#
5#は5+4#
4#は4+3#
3#は3+2#
2#は2+1#
1#は2+0#
と、遡行していきます。
そして、最後の問い0#とは何かの問いに対して
if(i-1>=0){
w=i+f(i-1);
}
else{
return(0);
}
のelse側で0であると答えます。
遡行(さかのぼること)を逆にたどれば
0#は0
1#は0+0#
2#は2+1#
3#は3+2#
4#は4+3#
5#は5+4#
6#は6+5#
7#は7+6#
8#は8+7#
9#は9+8#
10#は10+9#
再度遡行順に並べると
10#は10+9#
9#は9+8#
8#は8+7#
7#は7+6#
6#は6+5#
5#は5+4#
6#は6+5#
5#は5+4#
4#は4+3#
3#は3+2#
2#は2+1#
1#は0+0#
0#は0
結局これを全部つなげると
10#=10+9#=10+9+8#=10+9+8+7#
=10+9+8+7+6#=10+9+8+7+6+5#
=10+9+8+7+6+5+4#
=10+9+8+7+6+5+4+3#
=10+9+8+7+6+5+4+3+2#
=10+9+8+7+6+5+4+3+2+1#
=10+9+8+7+6+5+4+3+2+1+0#
=10+9+8+7+6+5+4+3+2+1+0
となり、1から10までの和が求められることがわかります。
以上の説明を聞いても、まだ皆さんの頭には??????
ガリレオ流にいえば『さっぱり、わからない』
ですね。
fがfに聞く?
どういうことでしょうか。
また、なぜ
0#は0
1#は0+0#
2#は2+1#
3#は3+2#
4#は4+3#
5#は5+4#
6#は6+5#
7#は7+6#
8#は8+7#
9#は9+8#
10#は10+9#
遡行(さかのぼること)の逆を説明しているのでしょうか。
初心者のためのjava 入門 基礎から応用まで
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第1部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第2部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第3部
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
VC++入門
VBA入門
専門用語なしのVBA入門
VB入門
初心者のためのEclipseによるJava入門