第9講 プロシージャの再帰的使用
第1話 プロシージャの再帰的使用とは?
このサイトは、最初魔方陣の研究から始まりました。
その後様々なページを付け加えることによって、
現在の姿になりました。
魔方陣の研究は、私が県立高校教諭になる前の塾教師時代にさかのぼります。
中学1年生から5次魔方陣の作り方
魔方陣の法則キーボードのF5を押すと実行されます。
あるいはスライドショー→最初からの順にクリックしても実行されます。)
を聞いて、どうしてこんなに簡単な方法で、
5次魔方陣が出来てしまうのかが不思議で、
謎を解明しようとして始まりました。
謎はすぐに解明できましたが、
県立高校教諭になっても研究は継続し、
パソコンに考えさせて、パソコンに高次魔方陣を自動生成させるという研究になりました。
研究を一気に跳躍させたものが、
魔方陣はプロシージャの再帰的使用で生成可能だというアイデアだったのです。
魔方陣がプロシージャの再帰的使用で生成できるにちがいないという発想は、
運転中に生まれました。
ただ、その当時は今から25年ぐらい前で、
可能だが当時のパソコンの性能では手に負えない計算量になり、
1個作り出すのに、数十日もかかってしまうかもしれないとも考えました。
ですが、やってみると8次魔方陣あたりでも10分もかからず生成できました。
(ただ、6次魔方陣については1個生成させるのに3日も要しました。
6次魔方陣だけは、私が特殊種法と呼んだ方法では無理だったからです。
数学者のオイラーは特殊種法と呼んだ方法では、
6次魔方陣を作り出せないことを証明しているという事実を知ったのは、
大分後のことで、特殊種法でなんとか6次魔方陣を生成させようと、
無駄な努力を重ねてしまいました。
ですが、その努力の結果BASIC・C言語・C++・パスカルを覚えて、
プログラミングの面白さに覚醒したのですから、
6次魔方陣には感謝の気持ちをもっています。
そして、南信州新聞においてナンプレ自動生成アプリが公式生成エンジンとして採用されましたが、
特殊種法研究の直接の成果が、数独自動作成ソフトなのです。
私が、全国に先駆けてナンプレ問題自動作成に成功できた理由は、
特殊種法にあったのです。
中学生にはじめて魔方陣を授業中に紹介したときに、
『先生、そんなの知ってなんになるんですか。』
といわれましたが、
一見何の価値もないような研究が後に大きな成果を生むということを示しています。
特にAIの時代には、何のためになるのかわからないような基礎の学習が、
生き残るために絶対に不可欠な条件です。

現在の最速プログラムを使用すれば、26次魔方陣クラスでも、
1秒で数百の勢いで当時のコンピュータのスペックでも生成できますから、
プログラムの出来不出来が大きくものをいうことがわかります。
できの悪いプログラムなら、現在最速のスパコンをつかっても10次魔方陣クラス辺りで1個も生成できませんが、
できのよいプログラムなら25年前のパソコンでもいくらでも生成できます。


私は、プロシージャの再帰的使用を分身の術とも名付けています。
たった1人しかいない自分を10人にも100人にも分身させることができるのです。
分身の方法はとっても簡単で、
自分に仕事を依頼するです。

プロシージャの再帰的使用とは、自分で自分を呼び出すことです。
普通仕事は他のプロシージャに依頼しますが、
なんと自分に仕事を依頼できるのです。
具体例を見てみましょう。
コード
Module Module1

  Sub Main() '私は社長だ。
    f(0)
  End Sub

  Sub f(a As Integer)
    If a > 0 Then
      Console.WriteLine("私は分身{0:d}です。", a)
    Else
      Console.WriteLine("私が本物です。")
    End If
    
If a + 1 < 10 Then f(a + 1)
  End Sub

End Module
実行画面
私が本物です。
私は分身1です。
私は分身2です。
私は分身3です。
私は分身4です。
私は分身5です。
私は分身6です。
私は分身7です。
私は分身8です。
私は分身9です。


f(a + 1)が自分に仕事を依頼している部分です。
If a + 1 < 10 Then がないと永久ループになってエラーします。
分身は私の記憶によると分身は4700人辺りが限界だからです。
分身と呼んでいますが、
見かけではなく、分身がちゃんと仕事をしています。
main()に呼び出された最初のf()が本体で、
それ以外はf()の分身です。
分身ですが、れっきとした社員の1人です。
つまり、分身も含めれば社員f()は10人です。
1人で10人分の仕事が出来ます。
私の記憶が正しければ、
1人で4700人分の仕事をさせることさえ可能なのです。

私は、再帰的使用のことを入れ子式人形でも比喩します。
入れ子式人形とは、七福神やロシアのマトリョーシカ人形を思い浮かべてもらえればよいと思います。
ロシアのマトリョーシカ人形は、七福神入れ子人形のまねらしいです。
源流は日本にあるようですね。
人形の中により小型の人形が入っているのが入れ子式人形です。
f()が自分を呼び出したときに、自分の中により小さい自分が入れ子式に発生するのだとイメージすればよいのです。

では
実行画面が
a=0
a=1
a=2
a=3
a=4
a=5
a=6
a=7
a=8
a=9

となるようにコードを改良して下さい。


第8講第9話へ   第2話へ

002

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

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