第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);
}
実行結果
c++

さて、上のプログラムでどうして
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#

遡行(さかのぼること)の逆を説明しているのでしょうか。






第2話へ 第4話へ

a

初心者のためのjava 入門 基礎から応用まで
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第1部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第2部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第3部
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
VC++入門
VBA入門
専門用語なしのVBA入門
VB入門
初心者のためのEclipseによるJava入門