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の式の意味もはっきりすると思います。
以上