第9講 社員が自分に命令することを繰り返す(プロシージャの再帰的使用)
第4話 遡行・逆遡及とは何?
プログラム文章再掲
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
なぜ、『逆遡行に言及しているの』
の問いに対する答えを示唆しておきましょう。
それは、遡行と逆遡行が
社員が繰り返し自分に命令する(プロシージャの再帰的使用)
の神髄であるということです。
遡行と逆遡行であるためプロシージャの自己再帰とも呼ばれます。
自己再帰?
ますます、謎めいてきましたね。
前半の問いに答えましょう。
前半の問いとは、fがfに聞くとはどういうこと?
でした。
もちろん、『fがfに聞く』は『fがfに命令する』の比喩的説明です。
プロシージャの再帰的使用とは何なのか。
プロシージャの自己再帰とは何なのか。
この問いに対して、私は入れ子式人形の比喩で答えることにしています。
七福神やロシアのマトリョーシカ人形(ウィキペディアより)は、
人形の中に人形が入っています。
七福神なら6個の人形が、
マトリョーシカ人形なら9個の人形が入れ子式に入っています。
一番外側の人形も数に入れればそれぞれ7個と10個です。
今回の1から10までの和を求めるプログラムも実は入れ子式の人形であり、
入れ子式人形は全部で10個あります。
一番外側の人形もいれれば系11個の人形があります。
最初に、Private Sub CommandButton1_Click()が
尋ねた人形が一番外側の人形です。
そして、初めてfがfに尋ねるとは
1番外側の人形が外から2番目の人形に尋ねることです。
2回目にfがfに尋ねるとは、
外から2番外側の人形が外から3番目の人形に尋ねることです。
実は同じfでも次元の違うfです。
次元が異なるというのは、人形が違っているわけです。
形態は同じでも異なる人形です。
外側の人形が内側の人形に尋ねているのです。
自分の本質がわからず、自分の内へ内へと遡及していっているわけです。
自分とは何か。
私たちは、いろいろな覆いをかぶっています。
会社では部長の役柄を、
家庭では父親の衣装を、
地域ではいい人を演じています。
いろいろなペルソナを演出していく内に、
どれが本当の自分であるか、わからなくなっています。
本当の自分を捜し求めるには、覆っている仮面や衣装を
外していって、
真の自分へ遡行していくしかありません。
今回の1から10までの和を求めるプログラムも
10#とは何か。
9#とは何か。
8#とは何か。
7#とは何か。
・
・
と遡及していって、
最後の人形0#にたどり着きます。
つまり、1番内側の人形に到着します。
このとき、初めて自分の本質を発見します。
答えは、なんと0なのです。
遡及が終わった後、逆遡及の旅に出ます。
1番内側の人形は0という答えを内側から2番目の人形に返します。
内側から2番目の人形は、
1番内側から返された答え0に1を加えた答え1を
内側から3番目の人形に返します。
内側から3番目の人形は、
内側から2番目の人形から返された答え1に2を加えた答え3を
内側から4番目の人形に返します。
内側から4番目の人形は、
内側から3番目の人形から返された答え3に3を加えた答え6を
内側から5番目の人形に返します。
内側から5番目の人形は、
内側から4番目の人形から返された答え6に4を加えた答え10を
内側から6番目の人形に返します。
内側から6番目の人形は、
内側から5番目の人形から返された答え10に5を加えた答え15を
内側から7番目の人形に返します。
内側から7番目の人形は、
内側から6番目の人形から返された答え15に6を加えた答え21を
内側から8番目の人形に返します。
内側から8番目の人形は、
内側から7番目の人形から返された答え21に7を加えた答え28を
内側から9番目の人形に返します。
内側から9番目の人形は、
内側から8番目の人形から返された答え28に8を加えた答え36を
内側から10番目の人形に返します。
内側から10番目の人形は、
内側から9番目の人形から返された答え36に9を加えた答え45を
内側から11番目の人形に返します。
内側から11番目の人形は、
内側から10番目の人形から返された答え45に10を加えた答え55を
Private Sub CommandButton1_Click()に返します。
Private Sub CommandButton1_Click()は
Cells(7, 1) = f(10)
によって、内側から11番目人形(1番外側外側の人形)から返された55を
A7に表示させて任務を終了します。
つまり、社員が自分に繰り返し命令する(プロシージャの再帰的使用)
とは、1番内側の人形へ遡行して本質を発見した後、
逆遡及をしていく方法なのです。
自己再帰とは、2重の意味で自己への還帰なのです。
1つは、より内なる自分へ遡及していくという意味の帰還であり、
また、より内なる自分から自分に帰ってくるという意味の再帰なのです。
きっと1回読んだだけでは、頭の中は整理できませんね。
ぜひ、繰り返して読んでください。
そして、ある程度理解できたら先に進んでください。
現時点で完全に理解できなくても、先に進んだり戻ったりしている内に、
完全な理解が訪れるときが来るものです。
さて、次の課題です。
さらに、一般化して
初項・末項・交差を入力して実行ボタンを押すと、
等差数列の和が求められるマクロを組んでください。
かなり難しいですよ。
第3話へ 第5話へ
vc++講義へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義へ
VB講義基礎へ
初心者のためのJava 入門 基礎から応用まで
数学研究室に戻る