第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次順列生成ソフトの開発に入ります。
本当はすべて引数でプロシージャに送ればよいのですが、
なるべくプロシージャをシンプルにするために、グローバル変数・配列を導入します。
グローバル変数・配列とは、
Module Module1

   Dim cn, x(25), n As Integer
  Sub Main()
    ・
  End Sub

  Sub f()
    ・
  End Sub

  Function g()
    ・
  End Function

  Function h(n As Integer)
    ・
  End Function

End Module
のようにmain()まで宣言した変数や配列のことです。
このグローバル変数やグローバル配列のスコープ(適応範囲)は、
プログラム全体となります。
今まで扱ってきた変数やプロシージャはプロシージャ内で宣言して、
スコープはプロシージャ内に限定されていました。
このような変数をローカル変数、配列をローカル配列といいます。
どこでも使えるグローバル変数またはグローバル配列は便利なように思えるかもしれませんが、
メモリ節約の観点からすると、グローバルにするのは好ましくはありません。
メモリ節約のためにVBでは、
プロシージャよりより小さな範囲にスコープを限定できる機能さえ持っています。
この点ではC言語を上回っています。
これはメモリ節約が重要であることを示しています。
ですから、グローバル変数・配列はなるべく使用しない方がよいのですが、
グローバル変数・配列を使用した方がプログラムコードが簡単になるために、
ゲームプログラミングでは多用されているという現実があります。

初心者のために、汎用的にして普遍的なn次順列生成ソフトの骨格を示しておくと、
Module Module1

  Dim cn, x(25), n As Integer
  Sub Main()
    Console.WriteLine("これはすべての順列を求めるソフトです。")
    Console.WriteLine("何の順列を発生させるのかをnに入力してエンターして下さい。")
    Console.WriteLine("n=")
    n = Console.ReadLine()
    cn=0
    f(0)
    Console.WriteLine("生成された順列は%d個です。\n",cn)
  End Sub

  Sub f(g As integer)
      ・
      ・
      ・
  End Sub

End Module
となります。
引数のgは4次順列生成プログラムにおいて
    For i = 0 To n - 1
      x(0) = i + 1
      For j = 0 To n - 1
        h = 1
        If j + 1 = x(0) Then h = 0
        If h = 1 Then
          x(1) = j + 1
             ・
の()内の添え字の役割を持ちます。
そして、プロシージャf()の中は2次元For文になります。
1番目の次元は入力ですし、
2番目の次元は2回登場し、
1回目は重複検査して、
2回目は重複検査を通ったものを表示します。

cn生成された順列をカウントするカウンタ(変数)です。


第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 入門 サイト 基礎から応用まで
本サイトトップへ