アルゴリズムとデータ構造レポート
初レポート。内容は
というもの。
リスト
リストは以前作った事があるので、よく分かる。双方向リンクリストを実装した。
でも、来週からはSchemeを授業でやるらしいけど、LISPのリスト構造にしてみた方が良いのかも。
そうすると、例えばforやwhileは使わず再帰を使って実装したほうが美しい。
純LISPというものは
- car
- cdr
- cons
- atom
- eq
の5つのみからなり、チューリング完全らしい。
この5種類だけで例えばi番目の要素を取り出す等の演算を実装してみると面白いかも。
この場合算術演算が使えない。というか整数型が無い。
で、集合と位相の授業で習ったけど
nilが0,(nil)が1,((nil) nil)が2, (((nil) nil) nil)が3
等として整数を定義できるとか言ってた気がする。(だったかな?)
a + 1 => (cons a nil)
a - 1 => (car a)
a == 0 => (eq a nil)
みたいな感じか。
でもCの構造体として実装するんだからいちいち整数を指定するのにcons(cons(cons(...), ...), ...)とか書いてらんない。
そのうちSchemeインタプリタ実装するらしいし面白いと思ったけどやめとこ。
整数環
整数環とは
- 加法が閉じている。零元、逆元がある。
- 結合則を満たす乗法がある。
- 加法と乗法について分配法則が成り立つ。
ものらしい。
これを作れって事は多倍長整数演算を実装せよって事だろうな。(まだやってない)
んで、これをCで作れと??まじですか??
Cでコード書くなら
big_integer a, b, c; a = bi_zero(); /* 零元 */ b = bi_init("でかい整数。文字列で指定"); c = bi_minus(b); /* 逆元 */ assert(a == bi_add(b, c)); ... assert(bi_mul(a, bi_mul(b, c)) == bi_mul(bi_mul(a, b), c)); /* 乗法の結合則 */ assert(bi_mul(a, bi_add(b, c)) == bi_add(bi_mul(a, b), bi_mul(a, c))); /* 分配法則 */
見たいなコードを書けってことか?正直言って見た目がヤバイ。
C++使って演算子オーバーロードしちゃいけないのだろうか...