第9講 関数の再帰的使用
第8話 普遍的n次生成ソフト開発のためのヒント
4次の段階でうんざりですよね。
ですが、第10講の題材の3次魔方陣や4次魔方陣生成アプリの場合、
3次魔方陣で9次順列、4次魔方陣で16次順列を自動生成させる必要があります。
つまり、3次の場合で10次元for文になりますし、
4次の場合なら17次元for文と気が遠くなることをしないと、
魔方陣は生成できません。

魔方陣生成なのにどうして順列生成の話をしているのでしょうか。
理由を説明しましょう。
123456789
123456798
123456879
123456798
    ・
    ・
といった順列を
123
456
789

123
456
798
 ・
 ・
2次元に並び直して、その中ですべての横合計・縦合計・対角線合計が同じものを探し出せれば、
魔方陣を発見できます。
つまり、今研究しているn次順列自動生成を、
直接魔方陣生成アプリに活かせるのです。
もちろん、数独(ナンプレ)もn次順列生成をうまく応用すれば、
数独を自動生成できます。
私が、まだDSでも数独自動生成アプリがでていない時代に、
すぐに数独自動生成ソフトが開発できた理由は、
魔方陣を研究していたからです。
そして、私が開発した数独自動作成アプリは今でもGoogleランキング1位ですから、
世の人にクオリティの高さを認められているということだと思います。

さて、いよいよ関数の再帰的使用によって、
汎用的にして普遍的なn次順列生成ソフトの開発に入ります。
本当はすべて引数で関数に送ればよいのですが、
なるべく関数をシンプルにするために、グローバル変数・配列を導入します。
グローバル変数・配列とは、
#include<stdio.h>
void f();
int g();
int h(int a);
int s,x[10];
int main(){
   ・
}
void f(){
   ・
}
int g(){
   ・
}
int h(int a){
   ・
}
のようにmain()まで宣言した変数や配列のことです。
このグローバル変数やグローバル配列のスコープ(適応範囲)は、
001
宣言した以降になります。
今まで扱ってきた変数や関数は関数内で宣言して、
スコープは関数内に限定されていました。
このような変数をローカル変数、配列をローカル配列といいます。
どこでも使えるグローバル変数またはグローバル配列は便利なように思えるかもしれませんが、
メモリ節約の観点からすると、グローバルにするのは好ましくはありません。
メモリ節約のためにC++では、関数よりより小さな範囲にスコープを限定できる機能さえ持っています。
これはメモリ節約が重要であることを示しています。
ですから、グローバル変数・配列はなるべく使用しない方がよいのですが、
グローバル変数・配列を使用した方がプログラムコードが簡単になるために、
ゲームプログラミングでは多用されているという現実があります。

初心者のために、汎用的にして普遍的なn次順列生成ソフトの骨格を示しておくと、
#include<stdio.h>
void f(int g);
int x[20];
int n,cn; //aをnに変更 変更理由はnuberの頭文字nは整数を表す場合が多いからです
int main() {
  printf("これはすべての順列を求めるソフトです。\n");
  printf("何の順列を発生させるのかをnに入力してエンターして下さい。\n");
  printf("n=");
  scanf("%d", &n);
  cn=0;
  f(0);
  printf("生成された順列は%d個です。\n",cn);
  return(0);
}
void f(int g){
    ・
    ・
    ・
}
となります。
引数のgは4次順列生成プログラムにおいて
    x[0] = i + 1;
      if (h == 1)x[1] = j + 1;
          if(hh==1)x[2] = k + 1;
              if(hhh==1)x[3]=l+1;
の[]内の添え字の役割を持ちます。
そして、関数f()の中は2次元for文になります。
1番目の次元は入力ですし、
2番目の次元は2回登場し、
1回目は重複検査して、
2回目は重複検査を通ったものを表示します。

尚、今まで順列のサイズをaで表してきましたが、次回以降はnにします。
変更理由は、注釈文に書いてあるとおりに、
数学の世界では整数をnで表すことが多いからです。


第7話へ   第9話へ

002

初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc** c言語 c** 入門 初心者 基礎から応用まで
eclipse c** 入門
魔方陣 数独で学ぶ VBA 入門

数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C**入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC**による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ