問題3.56 – SICP(計算機プログラムの構造と解釈)その150

問題3.56

;; stream の最初の n 個の要素を印字する手続き
(define (stream-head s n)
  (define (iter s n)
    (if (<= n 0)
      'done
      (begin
        (display (stream-car s))
        (newline)
        (iter (stream-cdr s) (- n 1)))))
  (iter s n))

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

(define S (cons-stream 1 (merge (scale-stream S 2)
                                (merge (scale-stream S 3)
                                       (scale-stream S 5)))))

;; 実行結果
(stream-head S 10)
gosh> 1
2
3
4
5
6
8
9
10
12
done
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»