第9講 社員が自分に命令することを繰り返す(プロシージャの再帰的使用)
第3話 なぜ1から10までの和が計算できるの?

プログラムの文章
Private Sub CommandButton1_Click()
  Cells(6, 1) = "1から10までの和"
  Cells(7, 1) = f(10)
End Sub
Private Sub CommandButton2_Click()
  Rows("6:200").Select
  Selection.ClearContents
  Cells(1, 1).Select
End Sub
Function f(a As Byte)
  If a - 1 >= 0 Then f = a + f(a - 1) Else f = 0
End Function
実行結果
入門

さて、上のプログラムでどうして
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
を表すものと約束します。

  Cells(7, 1) = f(10)
の右辺f(10)で10#とは何かとFunctionプロシージャfに聞きます。
すると、fはf = a + f(a - 1)すなわち10+9#であると答えます。
では、9#とは何かとf(a - 1)によって、fがfに尋ねます。
すると、するとfはf = a + f(a - 1)によってその答えは9+8#であると答えます。
では、8#とな何かとfがfに尋ねると、
fはf = a + f(a - 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 a - 1 >= 0 Then f = a + f(a - 1) Else f = 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話へ

トップ

vc++講義へ

初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義へ
VB講義基礎へ
初心者のためのJava 入門 基礎から応用まで
数学研究室に戻る