2001年度 免許法認定公開講座

 

数学教育特論U  レポート

入江 昇

 

「n個のものからr個を選んで並べる順列をすべて書き出す」というプログラムについて考えて見ます。最初に私たちならどうするか、具体的に、[A B C D] の4個の要素から3個を選んで並べる場合について確認します。

 

(1)       まず、先頭を決めます。・・・・・・・・・・・・Aにします

(2)       2番目にこれる可能性のあるものを考えます・・・A 以外のB C Dの3通りが     

                                             あります

(3)       3番目にこれる可能性のあるものを考えます・・ ABときたらそれ以外のCかD

                              ACときたらそれ以外のBかD

                                                 ADときたらそれ以外のBかC

(先頭がAになる場合はすべて書いたので、A以外で、)

(4)           先頭を決めます・・・・・・・・・・・・・・・ Bにします

    ・                    ・ ・igaide

                                              

(同様にして先頭がDとなる場合まで考えて終わりです)

 

[ABC]  [ABD]   [ACB]  [ACD]    [ADB]  [ADC]

[BAC]  [BAD]   [BCA]  [BCD]    [BDA]  [BDC]

[CAB]  [CAD]   [CBA]  [CBD]    [CDA]  [CDB]

[DAB]  [DAC]   [DBA]  [DBC]    [DCA]  [DCB]

 

の24通りになります。

 

さて、Logoならどうなるか考えて見ます。実は以下のプログラムはうまく作動しません。

原因としてはプログラム間の引数の状態の不一致等がありますが、現在の知識では修正するところまでは至りません。

ただ、手直しを加えて部分的にはうまくいくところもありますので、良いところ、悪いところを含めて説明します。

 

 

to  Junretu :List :k

   local [ f bf ]

   if :k = 0 [ output [] ]

   if :k = 1 [ output Parsed :List ]                           ・・・・・・・ い

   if empty? :List [ output [] ]

   output SelectFirst [] :List :List

end

to SelectFirst :T :L :Nokori

   local [ f bf bm Sippo]

   if empty? :Nokori [ output :T  ]

   make "f first :L

   make "bf butfirst :Nokori                                    ・・・・・・・ろ

   make "bm ButMem :f :L 

   make "Sippo Junretu :bm ( :k - 1 )

      output ( SelectFirst

      ( sentence :T ( PutAsFirst :f :Sippo ) )

        :L  :bf )

end

to PutAsFirst :f :S

   if empty? :S  [ output [] ]

   output sentence ( fput :f first :S )                      ・・・・・・・は

           PutAsFirst :f butfirst :S

end

to Parsed :L

   if empty? :L [ output [] ]

   if ( count :L ) = 1 [ output fput :L [ ] ]                                              output fput parse first :L                   ・・・・・・・に

                Parsed butfirst :L   

end

to ButMem :Item :List

  if empty?  :List [ output [] ]                                                                                                                                                                if ( first :List ) = ( first :Item )     

       [ output butfirst :List ]                                ・・・・・・・ほ

      output fput first :List

       ButMem :Item ( butfirst :List )

end

の部分) ButMem は指定した要素以外のListを求めます。

例えばButMem[b] [a b c d ] は[a c d]になります。順列を求めるとき、常に用いる考え方で、このプログラムにおいても重要な役割を果たしています。3行目の右辺にもfirstと入れたのは左辺にあわせて要素扱いとしたかったからです。

 

の部分) Parsed [a b c d ] [[a][b][c][d]]をあらわします。n個のものから1個を取り出して並べる順列の答えです。2、3行目に:Lの要素の個数に対する条件を入れ、動くようになりました。

 

(の部分)

PutAsFirst[a] [[bc][bd][cb][cd][db][dc]]  [[abc][abd][acb][acd][adb][adc]]を表します。つまり最初の引数を次の要素の一つ一つの先頭におくというプログラムです。

ただ、Junretu  [a b c d ] 3 を動かしたとき、PutAsFirst の中で fputへのbのインプットがおかしいです。」と出てしまうので、この部分で引数の状態が違ってしまうのだと思います。                   

                                                           

の部分)SelectFirst はこのプログラムの心臓部です簡単に [a b c d]から3個を取り出して並べる順列で説明するとこうです。まず、先頭のa以外のb c dから2個を取り出す順列を考え、それらの先頭にaをつけます。次にb以外のacdで順列を考え、それらの先頭にbをつけ・・・と順にやっていき、dまで考えた後、これまでに考えた順列を表示するというものです。

 

の部分)Junretu :List :k の部分は表題のようなもので、特に問題はないと思います

 

 

最後に授業に利用するときの改良点を述べます。

このプログラムがうまく動いたとすると、答えは(abc)(abd)(acd)・・・とaを先頭にしたものから順に並びますが、さらに表示の仕方を

(abc)(acb)(bac)(bca)(cab)(cba)

(bcd)(bdc)(cbd)(cdb)(dbc)(dcb)

(abd)(adb)(bad)(bda)(dab)(dba)

(acd)(adc)(cad)(cda)(dac)(dca)

のように、変えることができれば、網掛けしたものとその右側では組み合わせとしては同じものであるので、他のいろいろな順列をためしてみることで順列と組み合わせの関係が見つけられると考えます。またnCrの式の意味もはっきりすると思います。

                                                                            以上