Transcript Document

プログラミング演習B
ML編 第6回
2009/6/2(コミ)
2009/6/3(情報・知能)
住井
http://www.kb.ecei.tohoku.ac.jp/
~sumii/class/proenb2009/ml6/
今日のポイント
第1~5回の復習
+
どの機能を使えばよいか、
自分で考えるトレーニング

もしわからなくても、今までのスライド
を見直せば必ずできるはず!
– どうしてもわからなければ質問する
レポートについて
電気・情報系内のマシンから
http://130.34.188.208/
(情報・知能)
http://130.34.188.209/
(コミ)
にアクセスし、画面にしたがって提出せよ。締め切りは二週間後厳守。
 初回は画面にしたがい自分のアカウントを作成すること。
 「プログラム」のテキストボックスがある課題では、
プログラムとしてsmlに入力した文字列のみを
過不足なく正確にコピー&ペーストして提出せよ。
(smlの出力は「プログラム」ではなく考察に含めて書くこと。)
 プログラムの課題でも必ず考察を書くこと。
 提出したレポートやプログラムの実行結果は「提出状況」から
確認できる。
– 質問は[email protected]にメールせよ。
– レポートの不正は試験の不正と同様に処置する。
前回までのまとめ
「Standard ML簡単文法」
http://www.kb.ecei.tohoku.ac.jp/
~sumii/class/proenb2009/syntax.txt
を参照
プログラムの作り方
1.
問題を理解し、
プログラムの仕様を策定する
–
何を入力されたら、何を出力するべきか
(契約)


MLなど関数型言語では、「プログラム=関数」
「入力=引数」「出力=返値」と考えることが
多い
関数や引数には適切な名前をつける
プログラムの作り方
問題を理解し、
プログラムの仕様を策定する
2. 入力と出力の例を考える
1.
プログラムの作り方
問題を理解し、
プログラムの仕様を策定する
2. 入力と出力の例を考える
3. プログラムを書く
1.
–
MLでは(型と)関数を定義する


繰り返し(ループ)は、自然数についての
数学的帰納法で考え、再帰関数を定義する
入力がdatatypeで定義された型を持つときは、
その定義にしたがって場合わけ(や再帰)を
行うことが多い
プログラムの作り方
問題を理解し、
プログラムの仕様を策定する
2. 入力と出力の例を考える
3. プログラムを書く
4. 例を用いて、
書いたプログラムをテストする
1.
–
間違っていたら直す(デバッグ)

もしできれば数学的証明がベストだが…
課題6. 1
1.
2.
摂氏の温度を華氏に変換する関数ctof
を定義せよ。また、逆の関数ftocも定
義せよ。
商品の税抜き価格から、消費税(5%)
込みの価格を求める関数taxを定義せよ。

価格はいずれも整数とし、小数点以下の
端数は切り捨てること。
課題6. 2
1.
2.
正の整数nを引数として受け取り、
1からnまでの整数の「積」を返す
関数factを書け。
二つの整数mとnを受け取り、
二項係数mCn(m個のものから
n個のものを選ぶ場合の数)を返す
関数chooseを書け。

余裕があれば、無駄な計算をできるだけ
しないように工夫せよ。
課題6. 3 (optional)

自然対数の底eの近似値を、
テイラー展開により求める
関数expを定義せよ。
–
余裕があれば、どれぐらい
近似するか、許容する誤差を
指定できるようにせよ。
課題6. 4
1.
整数のリストxを受け取り、
そのすべての要素の和を返す
関数sumを定義せよ。

2.
考え方:xがnilのときは0を返す。
xがi::yの形のときはi + sum yを返す。
整数のリストを受け取り、
そのすべての要素の積を返す
関数prodを定義せよ。
課題6. 5
1.
整数のリストxを受け取り、その中から
偶数だけ抜き出したリストを返す関数f
を書け。

2.
考え方:xがnilのときはnilを返す。
xがi::yの形のときは、iが偶数ならば
i :: f yを、そうでなければf yを返す。
第4回の「苗字と名前と年齢のレコー
ド」のリストを受け取り、その中から年
齢が20以上のレコードを抜き出したリス
トを返す、という関数gを書け。
課題6. 6 (optional)
1.
2.
リストxと関数fを受け取り、
xの要素xiの中でf xiがtrueと
なるものを抜き出したリストを
返す、という関数filterを書け。
また、その型を考察せよ。
課題6. 5の二つの関数を、
filterを用いて定義し直せ。
課題6. 7 (optional)
1.
リスト[x1,x2,x3,...,xn]と
初期値s0と関数fを受け取り、
s1
s2
s3
...
sn
2.
= f x 1 s0
= f x 2 s1
= f x 3 s2
= f xn sn-1
というsnを返す関数foldを書け。
課題6. 4の二つの関数を、
foldを用いて定義し直せ。
課題6. 8 (optional)

整数のリストを受け取り、
昇順にソートしたリストを返す、
という関数を定義せよ。
–
できるだけ比較の回数が
少なくなるように書くこと