Parenist養成ゼミ: 演習課題2
この記事は、Parenist養成ゼミシリーズの記事である。
SICPの2章のように、課題をこなすうちにデータ抽象の大切さについて学べるような演習を作成した。柔軟性のあるプログラムを作成するには適切な抽象化が必須である。
課題
以下の課題を解け。ただし、参照透過性のある関数を実装する際にはテストも実装すること。
- 2次元実数空間上の元(以後ベクトルという)を表すようなlistを考案せよ。
- 2値を受け取り、ベクトルを返す関数
vector
を実装せよ。 - ベクトルを受け取り、その成分を取得する関数
vector-x1
およびvector-x2
を実装せよ。 以下の関数を、ベクトルを表すlistの構造に依存しないように実装せよ。
- ベクトルの成分をlistにして返す関数
vector-coord
- 2つのベクトルの和を返す関数
vector-add
- 2つのベクトルの内積を返す関数
vector-inner-product
- ベクトルのノルムを返す関数
vector-norm
- ベクトルの成分をlistにして返す関数
ノルムはベクトルに固有の値であるから、計算コスト削減のため二つの成分と一緒に保持することにした。新たに、ベクトルの成分とそのノルムを表すようなlistを考案せよ。さらに、以下の関数を修正するだけで、それ以外の関数の挙動が変わらないことを確認せよ。
- vector
- vector-x
- vector-y
- vector-norm
- それぞれの成分がランダムな値
0 <= xi < 1
であるようなベクトルを返す関数rand-vector
を実装せよ。 - 試行回数を受け取り、Monte Carlo法を用いて円周率を返す関数
simulate-pi
を実装せよ。