第10講 関数の再帰的呼び出し=関数の自己再帰の学習 
第5話 関数の再帰的呼び出しによる汎用的順列作成プログラム解説その1
解答コード再掲
class r{
  public static int[] x=new int[20];
  public static int n;
  public static int cn;
  public static void main(String args[]) throws IOException{
    BufferedReader a = new BufferedReader(new InputStreamReader(System.in));
    System.out.println("1からnまでの順列をすべて発生させます。");
    System.out.println("いくつまでの順列かキーボードから入力してください。");
    System.out.print ("n=");
    n=Integer.parseInt(a.readLine());
    cn=0;
    f(0);
    System.out.print ("順列総数=");
    System.out.print (cn);
  }
  public static void f(int g){
    int i,j,h;
    for(i=1;i<n+1;i++){
      x[g]=i;
      h=1;
      if(g>0){
        for(j=0;j<g;j++){
          if(x[g]==x[j]){
            h=0;
            break;
          }
        }
      }
      if(h==1){
        if(g+1<n){
          f(g+1);
        }
        else{
          cn++;
          for(j=0;j<n;j++){
            System.out.print(x[j]);
            System.out.print (" ");
          }
          System.out.println();
        }
      }
    }
  }
}


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に相当するものです。gは、世界(セル)の次元番号です。


くどいようですが、大事なことを繰り返します。

gはセル番号であり、対象にする空間(=世界=セル)の次元を示すのものです。
そして、次元(セル)が違えば、同じiでも次元と次元と次元は別物です。

は別次元の世界の住民です。

少しむずしい言い方をしてしましましたが、
簡単に言い直すと、
0,1,2はセル(数字や文字を入れる箱)のラベル名(箱の名前)であり、
そのラベルの貼ってあるセル(数字や文字を入れる箱)の内容です。
は、1,2,3と動き、現象的には0,1,2と似ていますが、
実際には、ビール瓶の例えでは
0,1,2はビール瓶のラベルですし、
ビール瓶に入っているビールで、全然違うものです。
セル番号
とセルの中身を明確に区別されてコードを読んでください。

ライラの冒険では、主人公の女の子はあちらこちらの次元の世界を行ったり来たりしますが、
このプログラムも、いろいろな次元を行ったり来たりします。
今どの次元にいるのか、入れ子式人形例えでは、外側から何番目の人形のところにいるのかを明瞭・明確に理解していないと、
訳がわからなくなります

次元の異なる世界を行ったり来たりするとは、
セルを行ったり来たりするということです。
現在どこのセルにいて、何をしているのかを明瞭・明確にしてください。
何をしているかというのは、
具体的にはセルに数字の何を入れ、その数字が以前のセルと重複がないかの検査中なのかということです。

次話では具体的にトレースしていきます。





第4話へ 第6話へ

戻る

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