2010-05-01から1ヶ月間の記事一覧

SICP 問題 2.49(各種ペインタの定義)

問題 segments->painter を使い、次の基本的ペインタを定義せよ: a. 指定されたフレームの外形を描くペインタ b. フレームの向か側の頂点を結んで「X」を描くペインタ c. フレームの辺の中点を結んで菱形を描くペインタ d. wave ペインタ 解答 まずは segme…

SICP 問題 2.48(有向線分の構成子、選択子を定義する)

問題 平面上の有向線分はベクタの対 ─原点から線分の始点へ向かうベクタと、始点から線分の終点へ向かうベクタ─ で表現できる。問題 2.46 のベクタ表現を使い、この線分の表現を構成子 make-segment と選択子 start-segment 及び end-segment として定義せよ…

SICP 問題 2.47(フレームの選択子を定義する)

問題 フレームの構成子に候補が二つある: ;候補1 (define (make-frame origin edge1 edge2) (list origin edge1 edge2)) ;候補2 (define (make-frame origin edge1 edge2) (cons origin (cons edge1 edge2))) 構成子のそれぞれに、フレームの実装となる適…

SICP 問題 2.46(frameを構成するための各種手続きを定義する)

問題 原点からある点へ向かう二次元のベクタ v は x 座標と y 座標からなる対で表現できる。構成子 make-vect と、対応する選択子 xcor-vect と ycor-vect を作り、ベクタのデータ抽象を実装せよ。その選択子と構成子を使い、ベクタの加算、減算、スカラーに…

SICP 問題 2.45(right-split と up-split を、手続きを返す手続き split を使って具体化してみる)

問題 right-split と up-split は汎用分割演算の具体化として表すことができる。 (define right-split (split beside below)) (define up-split (split below beside)) の評価が既に定義したものと同じ振る舞いの手続き right-split と up-split を作り出す…

SICP 問題 2.44(up-splitを定義)

問題 corner-split で使った手続き up-split を定義せよ。below と beside の働き切り替える他は right-split と同様である。 解答 corner-split と right-split は直前に記載されているのでここに掲載しておこう。 (define (corner-split painter n) (if (=…

SICP §2.2.4(図形言語 その1)

来ました、図形言語。 グラフィックスを表示可能な環境が必要になるわけだが何を使えばいいのやら。。 で、既に SICP やっている方々のブログを見ると、大体皆さん gauche-gl つうのを使用している模様。 ちょいと調べて見たところ、この gauche-gl つうのは…

SICP §2.2.4(図形言語 その2)

最低限の情報収集が完了したか?? とりあえず現時点での経過をメモ。 gauche-gl は既にインストール済みとし、以下の各コードを適当なファイルにコピペして実行権限をつけて実行してみると、段階を追って画面描画ができていることが分かると思うっす。 wind…

SICP 問題 2.43(非効率な queens に関する考察)

問題 Louis Reasoner は問題 2.42 をやるのに恐ろしく時間がかかった。彼の手続き queens は動くように見えたがすごく遅かった。(Louis は 6×6 を解くのさえ、待つわけにいかなかった。)Louis が Eva Lu Ator に助けを求めた時、彼女は彼が flatmap の写像…

SICP 問題 2.42(エイトクイーンパズル)

もんのすげえ時間食った。。トータル4日間?アホだな俺。 問題 「エイトクイーンズパズル」はチェス盤上に八つのクイーンを、どのクイーンも他のと当たりにならないような(つまりどの二つのクイーンも同じ行、同じ列、同じ斜めの筋にならないような)置き…

SICP 問題 2.41(3つの数字の組合わせの全パターンを求める)

問題 与えられた整数 n に対して、n より小さいか等しい相異なる正の整数 i, j, k の順序付けられた三つ組で、和が与えられた整数 s になるものを全て見つけよ。 解答 前問の unique-paires を拡張して unique-3s とかにして、三つ組のリストを生成したのち…

SICP 問題 2.40(全ての相異なる数字による組合わせを求める)

問題 与えられた整数 n に対し、1≦j<i≦n の対 (i, j) の並びを生成する手続き unique-paires を定義せよ。unique-pairs を使って、上の prime-sum-paires の定義を簡単にせよ。 解答 まずは unique-paires から。 「与えられた整数 n に対し、1≦j<i≦n の対…

SICP 問題 2.39(fold-right と fold-left を使って reverse を実装)

【問題】 reverse(問題 2.18)の、問題 2.38 の fold-right と fold-left を使った、次の定義を完成せよ。 (define (reverse sequence) (fold-right (lambda (x y) ) '() sequence)) (define (reverse sequence) (fold-left (lambda (x y) ) '() sequence))…

SICP 問題 2.38(fold-rightとfold-left)

【問題】 accumulate 手続きは、並びの先頭の要素を右方の全ての要素を組み合わせた結果に組み合わせるので、 fold-right としても知られている。逆向きに仕事をしながら要素を組み合わせる他は fold-right と類似な fold-left もある。 (define (fold-left …

SICP 問題 2.37(ベクタ、マトリクスの演算)

【問題】 ベクタ v = (v_i) を数の並びで、マトリクス m = (m_ij) をベクタ(マトリクスの行)の並びで表現するとしよう。例えばマトリクス ┌ 1 2 3 4 ┐ │ 4 5 6 7 │ └ 6 7 8 9 ┘は、並び ((1 2 3 4) (4 5 6 7) (6 7 8 9) )と表現する。この表現を使えば、並…

SICP 問題 2.36(アキュムレータの拡張)

問題 手続き accumulate-n は第3引数として全てが同数の要素からなる並びの並びをとる他は accumulate と同じである。 これはアキュムレーションとして指定した手続きを、並びの全ての第1要素、全ての第2要素と言う風に作用させ、結果の並びを返す。 例えば…

SICP 問題 2.35(アキュムレータを使用して count-leaves を再定義)

問題 2.2.2節の count-leaves アキュムレーションとして再定義せよ。 (define (count-leaves t) (accumulate (map ))) 解答 まずは2.2.2節の count-leaves を再掲しちゃう。 (define (count-leaves x) (cond ((null? x) 0) ((not (pair? x)) 1) (else (+ …

SICP 問題 2.34(Hornerの方法)

【問題】 x の多項式の、ある x の値での評価は、アキュムレーションとして形式化できる。多項式 a_n・x^n + a_(n-1)・x^(n-1) + … + a_1・x + a_0は、計算を (… (a_n・x + a_(n-1))・x) + … + a_1)・x + a_0と構造化する Horner の方法(Horner's rule)と…

SICP 問題 2.33(アキュムレータを使って map、append、length を定義してみる)

【問題】 リスト操作の基本演算の、アキュムレーションとしての定義が以下にある。掛けた部分を補って完成せよ。 (define (map p sequence) (accumulate (lambda (x y) ) nil sequence)) (define (append seq1 seq2) (accumulate cons )) (define (length s…

SICP 問題 2.32(部分集合を求める)

【問題】 集合は相異なる要素のリストで表現できる。また、集合の全ての部分集合の集合を、リストのリストで表現できる。例えば集合が (1 2 3)の時、全ての部分集合の集合は、 (() (3) (2) (2 3) (1) (1 3) (1 2) (1 2 3) )である。集合の部分集合の集合を作…

SICP 問題 2.31(square-tree を抽象化して、map の tree バージョンを作る)

【問題】 問題 2.30 の答えを抽象化し、square-tree が (define (square-tree tree) (tree-map square tree))と定義できるように、手続き tree-map を作れ。 【解答】 まぁ、当然抽象化の方向に行くよね。 (define (square-tree tree) (tree-map square tree…

SICP 問題 2.30(mapの拡張)

【問題】 問題 2.21 の square-list 手続きと類似の手続き square-tree を定義せよ。 つまり、square-tree は、次のように振る舞わなければならない。 (square-tree (list 1 (list 2 (list 3 4) 5) (list 6 7))) (1 (4 (9 16) 25) (35 49))square-tree を直…

SICP 問題 2.29(ツリー構造のデータの扱いとか、list と cons の違いとか・・・)

クソ長え・・・ 【問題】 二進モービルは、左の枝と右の枝の二つの枝でできている。それぞれの枝はある長さの棒で、そこから錘(おもり)か、別の二進モービルがぶら下がっている。二進モービルを二つの枝から(例えば list を使って)できている合成データ…

SICP 問題 2.28(葉をトップレベルの要素に全て展開する)

【問題】 引数として(リストとして表現されている)木をとり、その要素が、木の全ての葉を、左から右の順に並べたものであるリストを返す手続き fringe を書け。例えば、 (define x (list (list 1 2) (list 3 4))) (fringe x) (1 2 3 4) (fringe x x) (1 2 …

SICP 問題 2.27(部分枝も逆順にするdeep-reverse手続き)

【問題】 問題 2.18 の手続き reverse を修正し、引数としてリストをとり、要素を逆順にし、更に部分木も奥まで逆順にする手続き、deep-reverse を作れ。 例えば (define x (list (list 1 2) (list 3 4))) x ((1 2) (3 4) ) (revese x) ((3 4) (1 2) ) (deep…

SICP 問題 2.26(append/cons/listを、リストに適用した場合の違い)

【問題】 x と y をリストとして定義したとしよう。 (define x (list 1 2 3)) (define y (list 4 5 6)) 次の式のそれぞれの評価に応じて、解釈系が印字する結果は何か。 (append x y) (cons x y) (list x y) 【解答】 append はリストのトップレベルの要素を…

SICP 問題 2.25(リストから7を取り出すcar/cdrの組み合わせ)

【問題】 次のそれぞれのリストから、7を取り出す car と cdr の組み合わせを書け。 ① (1 3 (5 7) 9) ②((7)) ③ (1 (2 (3 (4 (5 (6 7)))))) 【解答】 普通に解いてみる。 ;①について (define lis1 '(1 3 (5 7) 9)) (car (cdr (car (cdr (cdr lis1))))) ;②に…

まいった。。

5月1日から5月5日まで発熱して寝込んじまって何にも進められんかった。。