さかもとのブログ

つらつらと

SICP演習問題3.56~3.60

streamの表示用に

(define (stream-ref-list n s)
  (let loop ((count 0))
    (if (= count n)
        'done
        (begin
          (format #t "~a " (stream-ref s count))
          (loop (+ count 1))))))

nとsは逆のほうがいい(じゃあそうしろよ)

;;exercise3.56
(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 ;s1car eq s2car
                  (cons-stream s1car
                               (merge (stream-cdr s1)
                                      (stream-cdr s2)))]))]))

(define S (cons-stream 1 (merge (scale-stream S 3)
                                (merge (scale-stream S 5)
                                       (scale-stream S 7)))))
(stream-ref-list 10 S)

;;exercise3.58
;;よくわからなかったので解答を確認した
(define (expand num den radix)
  (cons-stream
   (quotient (* num radix) den)
   (expand (remainder (* num radix) den) den radix)))

(define test1 (expand 1 7 10))
(stream-ref-list 12 test1)
;=> 1 4 2 8 5 7 1 4 2 8 5 7 done
(/ 1.0 7)
;=> 0.14285714285714285
;すげぇ

(define test2 (expand 3 8 10))
(stream-ref-list 10 test2)
;=> 3 7 5 0 0 0 0 0 0 0 done
(/ 3.0 8)
;=> 0.375

3.59からは数学.
べき級数とかやったんだけどな.やったことは確かに覚えている.
でもまったく覚えていない.なので動きがいまいちわかっていない.
ちなみに解析概論はAだったw

;;exercise3.59
;;a
(define (integrate-series stream)
  (let loop ((count 1)
             (stream stream))
    (cons-stream
     (/ (stream-car stream) count)
     (loop (+ count 1) (stream-cdr stream)))))

;;解答確認1
(define (integrate-series stream)
  (let ((n 0))
    (stream-map (lambda (x)
                  (set! n (+ n 1))
                  (/ x n)) stream)))
;;解答確認2
(define (integrate-series stream)
  (stream-map / stream integers))

;;b
(define exp-series
  (cons-stream 1 (integrate-series exp-series)))
(stream-ref-list 5 exp-series)

(define cosine-series
  (cons-stream 1
               (stream-map - (integrate-series sine-series))))

(define sine-series
  (cons-stream 0 (integrate-series cosine-series)))

解答を見る前にべき級数を見てもわからなかったけれど,解答を見てから見たら「なるほど」と思った.

;;exercise3.60
;;解答確認
(define (mul-series s1 s2)
  (cons-stream (* (stream-car s1) (stream-car s2))
               (add-streams (stream-map
                             (lambda (x) (* (stream-car s1) x))
                             (stream-cdr s2))
                            (mul-series (stream-cdr s1) s2))))

(define square-sine-and-square-cosine
   (add-streams
  (mul-series sine-series sine-series)
  (mul-series cosine-series cosine-series)))

(stream-ref-list 20 square-sine-and-square-cosine)
;=> 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 done

ちゃんと1になる.