第10講 関数の再帰的呼び出し=関数の自己再帰の学習
第5話 関数の再帰的呼び出しによる汎用的順列作成プログラム解説その1
n=3の場合で解説していきます。
最初に重要な注意があります。
gとiの役割の違いを明確にしないと、このプログラムは理解困難なものになります。
gはセル番号であり、iはそのセルに入る具体的な数字です。
入れ子式人形の例でいうと、gは外側(先の例と内側・外側が反対)からg+1番目の人形を表します。
それに対して、iはその人形の色や顔つきなどの性質です。
gは空間識別番号であり、世界の次元を示すものです。
iはその空間に入れる1,2,3という数字です。
f(g)がf(g+1)を呼び出していていますが、入れ子式人形の例でいうと外側の人形が内側の人形を呼び出しています。
つまり外側からg+1番目の人形が外側からg+2番目の人形を呼び出しています。
比喩でなく実体に即していうと、gはセル番号です。
0 | 1 | 2 |
i | i | i |
つまり、上の表の0,1,2に相当するものです。gは、世界(セル)の次元番号です。
くどいようですが、大事なことを繰り返します。
gはセル番号であり、対象にする空間(=世界=セル)の次元を示すのものです。
そして、次元(セル)が違えば、同じiでも次元0のiと次元1のiと次元2のiは別物です。
0 | 1 | 2 |
i | i | i |
iとiとiは別次元の世界の住民です。
少しむずしい言い方をしてしましましたが、簡単に言い直すと、
0,1,2はセル(数字や文字を入れる箱)のラベル名(箱の名前)であり、
iとiとiはそのラベルの貼ってあるセル(数字や文字を入れる箱)の内容です。
iとiとiは、1,2,3と動き、現象的には0,1,2と似ていますが、
実際には、ビール瓶の例えでは0,1,2はビール瓶のラベルですし、
iとiとiはビール瓶に入っているビールで、全然違うものです。
セル番号gとセルの中身iとiとiを明確に区別されてコードを読んでください。
ライラの冒険では、主人公の女の子はあちらこちらの次元の世界を行ったり来たりしますが、
このプログラムも、いろいろな次元を行ったり来たりします。
今どの次元にいるのか、入れ子式人形例えでは、外側から何番目の人形のところにいるのかを明瞭・明確に理解していないと、
訳がわからなくなります。
次元の異なる世界を行ったり来たりするとは、
セルを行ったり来たりするということです。
現在どこのセルにいて、何をしているのかを明瞭・明確にしてください。
何をしているかというのは、
具体的にはセルに数字の何を入れ、その数字が以前のセルと重複がないかの検査中なのかということです。
次話では具体的にトレースしていきます。