問題2.62 – SICP(計算機プログラムの構造と解釈)その74
問題2.62 set1 が空集合の場合は set2 を返す。 set2 が空集合の場合は set1 を返す。 set1 の最初の要素と set2 の最初の要素が等しい場合は、"set1 の最初の要素"と "set1、set2 の残りの要素のリストの和集合から成るリスト"を返す。 set1 の最初の要素が set2 の最初の要素より小さい場合は、"s…続きを読む
問題2.62 set1 が空集合の場合は set2 を返す。 set2 が空集合の場合は set1 を返す。 set1 の最初の要素と set2 の最初の要素が等しい場合は、"set1 の最初の要素"と "set1、set2 の残りの要素のリストの和集合から成るリスト"を返す。 set1 の最初の要素が set2 の最初の要素より小さい場合は、"s…続きを読む
問題2.61 x に等しいか x より大きなものが見つかれば走査は終了する。 最悪の場合は集合の大きさ n のステップ数になるが、平均すると n/2 のステップ数となる。 (define (adjoin-set x set) (cond ((null? set) (list x)) ((= x (car set)) set) ((< x (car set)) (cons x set)) (e…続きを読む
問題2.60 重複の許されるリストで集合を表す。 element-of-set?、intersection-set はそのままでよい。 重複を許すと結果のリストが大きくなり、要素の検索等の効率が悪くなる。 (define (adjoin-set x set) (cons x set)) (adjoin-set ‘1 ‘(1 2 3 4 5)) gosh> (1 1 2 3 4 5) (def…続きを読む
2.3.3 例:集合の表現 – 順序づけられないリストとしての集合 intersection-set 手続き set1、set2 のいずれかが空集合ならば ‘() を返す。 set1 の最初の要素が set2 に含まれていれば、"set1 の最初の要素" と "set1 の残りの要素と set2 との積集合" とから成るリストを返す。 それ以外の…続きを読む
問題2.58 a. 式は完全に括弧に囲まれている場合 (define (make-sum a1 a2) (list a1 ‘+ a2)) (define (make-product m1 m2) (list m1 ‘* m2)) (define (sum? x) (and (pair? x) (eq? (cadr x) ‘+))) (define (addend s) (car s)) (defi…続きを読む
問題2.57 和の表現の改良 ; 元の被加数 (define (augend s) (caddr s)) ; 任意個の項の和を扱えるようにした被加数 (define (augend s) (if (null? (cdddr s)) (caddr s) (cons ‘+ (cddr s)))) 積の表現の改良 ; 元の被乗数 (define (multiplicand p) (caddr p)) ;…続きを読む
問題2.56 べき乗(冪乗 – Wikipedia): base ^ exponent (baseexponent) べき乗は最初の要素が ** のリスト。 (define (exponentiation? x) (and (pair? x) (eq? (car x) ‘**))) 底(基数)はべき乗のリストの第2項。 (define (base s) (cadr s)) 指数はべき乗…続きを読む
問題2.53 (list ‘a ‘b ‘c) gosh> (a b c) (list (list ‘george)) gosh> ((george)) (cdr ‘((x1 x2) (y1 y2))) gosh> ((y1 y2)) (cadr ‘((x1 x2) (y1 y2))) gosh> (y1 y2) (pair? (car ‘(a short list))) g…続きを読む
問題2.52 a. wave に笑っているような線分を加える (define wave (segments->painter (list (make-segment (make-vect 0.35 0.85) (make-vect 0.40 1.00)) (make-segment (make-vect 0.65 0.85) (make-vect 0.60 1.00)) (make-segm…続きを読む
問題2.51 手続き below は、2つのペインタを引数にとり、第1のペインタをフレームの下半分に、第2のペインタをフレームの上半分に表示する transform-painter を使った場合 (define (below painter1 painter2) (let ((split-point (make-vect 0.0 0.5))) (let ((paint-bottom (transf…続きを読む