第8講 社員が自分自身に仕事を命令する=メソッドの再帰的使用

第8話 汎用的な魔方陣自動生成プログラムに総数カウントを付け加える
jioewjf
0577
bo

を実現するプログラム例
#! ruby -Ks
print "何の順列を生成するのかをキーボードから入力して下さい。n="
n=gets.to_i
print n,"次順列の生成\n"
def
f(a,g,n,cn)
 y=g/n
 x=g%n
 i=1
 (n*n).times do
  h=1
  if g>0 then
   for j in 0..(g-1)
    jy=j/n
    jx=j%n
    if i==a[jy][jx] then
     h=0
     break
    end
   end
  end
  if h==1 then
   a[y][x]=i
  end
  if h==1 then
   if x==n-1 then
    w=0
    for j in 0..(n-1)
     w+=a[y][j]
    end
    if w!=n*(n*n+1)/2 then
     h=0
    end
   end
  end
  if h==1 then
   if y==n-1 then
    w=0
    for j in 0..(n-1)
     w+=a[j][x]
    end
    if w!=n*(n*n+1)/2 then
     h=0
    end
   end
  end
  if h==1 then
   if x==0 && y==n-1 then
    w=0
    for j in 0..(n-1)
     w+=a[j][n-1-j]
    end
    if w!=n*(n*n+1)/2 then
     h=0
    end
   end
  end
  if h==1 then
   if x==n-1 && y==n-1 then
    w=0
    for j in 0..(n-1)
     w+=a[j][j]
    end
    if w!=n*(n*n+1)/2 then
     h=0
    end
   end
  end
  if h==1 then
   if g+1<n*n then
    
cn=f(a,g+1,n,cn)
   else
    hy(a,n)
    
cn+=1
   end
  end
  i+=1
 end
 
return cn
end
def hy(a,n)
 i=0
 n.times do
  j=0
  n.times do
   print a[i][j]," "
   j+=1
  end
  print "\n"
  i+=1
 end
 print "\n"
end
a=[0]
i=0
n.times do
 a[i]=[[0]]
 i+=1
end
print n,"次魔方陣が",f(a,0,n,0),"個生成されました。"
参考ダウンロード添付ファイル
ピンクが変更箇所です。

かなり難しかったでしょう。

ポイントは
    cn=f(a,g+1,n,cn)
にあります。
これを入れないと正しくカウント(数えること)されません。
もし、配列a、変数g、変数nに$をつけて、
グローバル変数(社長を含む全社員に共有される箱)に変更したとすれば、
    cn=f(cn)
となります。
この式を見て?が浮かぶかも知れませんが、
    w=w+1
のような式を思い出せば、疑問が解けます。
=は←のようにイメージした方がよかったことを思い出して下さい。
    w←w+1
wという箱に入っている中身を取り出し(参照し)、それに
1を加えてから、
改めてwという箱に入れるという操作でした。
    cn=f(cn)
も実際には、
    cn←f(cn)
ですから、cnという箱の中身をfという機械で加工してから、
改めて、cnという箱に入れ直す操作です。
今まで、メソッドのことを社員と呼んできましたが、
メソッドのことを機械とイメージしてもよいのです。
機械に原材料(引数)を入れると、
加工して製品(戻り値)を返してくれるものですから。
cnという箱に入っているものを加工してから、
あらためてcnという箱に入れて直しているわけです。

今回の参考ダウンロード添付ファイル
は、とても原始的な魔方陣自動生成ソフトです。
力業で、強引に魔方陣を作り出しているだけです。
4次魔方陣でさせ、すべて生成させようとしたら、
何時間もかかります。
先に1時間ぐらいと書きましたが、
実験してみたら、3,4時間かけても半分ぐらいしか出来ませんでした。
5次になると1個作るにのにも、恐ろしいほど時間がかかります。
ですが、いろいろ工夫していくと魔方陣自動生成ソフトは、
生成速度が1万倍、1億倍、1兆倍と倍加していきます。
改良を加えるほど、生成速度は倍加していきます。
今回の原始的なソフトでは、
パソコンの数万倍から数億倍の演算能力を持つ
スパコン(スーパーコンピュータ)を使ってとしても、
6次の段階でまったく歯が立ちません。
ところが、改良していくとパソコンでさえ26次魔方陣クラスが、
1秒で数百個の単位で生成できるようになるのです。
ここにプログラミングのおもしろさがあります。
物事を決定するのは、
コンピュータの演算能力ではなく、
プログラム側にあるのです。

どんどん改良を加えていきます。
ですから、
改良によってどのぐらい生成速度が倍加したのかが分かるように、
今回の参考ダウンロード添付ファイル
に時間計測機能を付け加えて下さい。
Time.now
をつかうと現時刻が取得できますので、
プログラムの4行目に
h=Time.now
を入れて、最後に
o=Time.now
を入れておいて、
その2つの差を表示すれば、時間計測が出来ます。
hとoは現時刻を入れるための変数です。
jioewjf
0577
0399



第7話へ
 第9話へ

004

eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
vc++講義へ
vba 2013 2010 2007 入門へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
専門用語なしの C言語 C++ 入門(Visual C++ 2010で学ぶ C言語 C++ 入門)
専門用語なしの excel vba マクロ 入門 2013 2010 2007 対応講義 第1部
eclipse java 入門へ
excel 2016 vba 入門第1部へ
本サイトトップへ