第10講 社員が自分に命令することを繰り返す(関数の再帰的使用)

第4話 遡行・逆遡及とは何?

プログラムの文章
#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++


なぜ、『逆遡行に言及しているの』
の問いに対する答えを示唆しておきましょう。
それは、遡行と逆遡行が
社員が繰り返し自分に命令する(関数の再帰的使用)
の神髄であるということです。
遡行と逆遡行であるため関数の自己再帰とも呼ばれます。
自己再帰?
ますます、謎めいてきましたね。

前半の問いに答えましょう。
前半の問いとは、fがfに聞くとはどういうこと?
でした。
もちろん、『fがfに聞く』は『fがfに命令する』の比喩的説明です。
関数の再帰的使用とは何なのか。
関数の自己再帰とは何なのか。
この問いに対して、私は入れ子式人形の比喩で答えることにしています。
七福神やロシアのマトリョーシカ人形(入れ子式人形ウィキペディアより)は、
人形の中に人形が入っています。
七福神なら6個の人形が、
マトリョーシカ人形なら9個の人形が入れ子式に入っています。
一番外側の人形も数に入れればそれぞれ7個と10個です。
今回の1から10までの和を求めるプログラムも実は入れ子式の人形であり、
入れ子式人形は全部で10個あります。
一番外側の人形もいれれば系11個の人形があります。
最初に、mainが
尋ねた人形が一番外側の人形です。
そして、初めて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を
mainに返します。
mainは
  printf("1+2+3+4+5+6+7+8+9+10=%d\n",f(10));
によって、内側から11番目人形(1番外側外側の人形)から返された55を
c++黒い画面に表示させて任務を終了します。

つまり、社員が自分に繰り返し命令する(関数の再帰的使用)
とは、1番内側の人形へ遡行して本質を発見した後、
逆遡及をしていく方法なのです。
自己再帰とは、2重の意味で自己への還帰なのです。
1つは、より内なる自分へ遡及していくという意味の帰還であり、
また、より内なる自分から自分に帰ってくるという意味の再帰なのです。

きっと1回読んだだけでは、頭の中は整理できませんね。
ぜひ、繰り返して読んでください。
そして、ある程度理解できたら先に進んでください。
現時点で完全に理解できなくても、先に進んだり戻ったりしている内に、
完全な理解が訪れるときが来るものです。

さて、次の課題です。
さらに、一般化して
C++
初項・末項・交差をキーボードから入力してエンターすると、
C
等差数列の和が求められるプログラムを組んでください。
かなり難しいですよ。







第3話へ 
第5話へ

a

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