2013年8月15日木曜日

開発環境

計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の3(標準部品化力, オブジェクトおよび状態)、3.5(ストリーム)、3.53(ストリームパラダイムの開発)、対の無限のストリーム、問題 3.70を解いてみる。

その他参考書籍

問題 3.70

コード(BBEdit)

sample.scm

(define (merge-weighted s1 s2 weight)
  (cond ((stream-null? s1) s2)
        ((stream-null? s2) s1)
        (else
         (let ((s1car (stream-car s1))
               (s2car (stream-car s2)))
           (if (< (weight s1car)
                  (weight s2car))
               (cons-stream s1car 
                            (merge-weighted (stream-cdr s1) 
                                            s2
                                            weight))
               (cons-stream s2car 
                            (merge-weighted s1 
                                            (stream-cdr s2)
                                            weight)))))))

(define (weighted-pairs s t weight)
  (cons-stream
   (list (stream-car s) (stream-car t))
   (merge-weighted
    (stream-map (lambda (x) (list (stream-car s) x)
                            (stream-cdr t)))
    (weighted-pairs (stream-cdr s) (stream-cdr t) weight)
    weight)))

a.

コード(BBEdit)

(define (weight-i+j pair)
  (+ (car pair) (cadr pair)))

(define pairs-weighted-i+j
  (weighted-pairs integers integers weight-i+j))

b.

コード(BBEdit)

(define (weight-2i+3j+5ij pair)
  (let ((i (car pair))
        (j (cadr pair)))
    (+ (* 2 i)
       (* 3 j)
       (* 5 i j))))

(define integers-not-div-2-3-5
  (stream-filter (lambda (x)
                   (and (not (= (reminder x 2) 0))
                        (not (= (reminder x 3) 0))
                        (not (= (reminder x 5) 0))))
                 integers))

(define pairs-weighted+2i+3j+5ij
  (weighted-pairs integers-not-div-2-3-5
                  integers-not-div-2-3-5
                  weight-2i+3j+5ij))   

0 コメント:

コメントを投稿