이 문제는 스트림 S를 인자로 받아

첫 번째 원소부터 해당 원소까지 전부 더하는 프로시저를 만드는 문제입니다.

처음에는 조금 혼란이 왔지만,

책에 fibs(피보나치 수열)을 설명한 것에 맞춰 설계하였습니다.

 

fibs 정의

밑의 스트림은 위의 두 스트림을 더하여 만든 것입니다.

 

이것을 기초로 이 문제에 맞게 숫자를 배열하였습니다.

첵에 소개하였듯이 기본적으로 인자 S는 integers로 하였습니다.ㅇ

 

    2  3  4  5  6  ... = (stream-cdr integers)

    1  3  6 10 15 ... = (partial-sums S)

1  3  6 10 15 21 ... = (partial-sums S)

 

즉, 처음 원소로 S의 첫 원소를 잡습니다.

그 이후로 그 뒤의 스트림과 자기 자신을 더하면 그 다음 원소가 나옵니다.

 

잘 되는군요.^^

 

 

참조

해럴드 애빌슨, 김재우 역, <컴퓨터 프로그램의 구조와 해석>, 인사이트, 2007, pp. 430

 

 

; stream
(define true (= 0 0))
(define false (= 1 0))

(define (cons-stream a b)
  (cons a (delay b)))
(define the-empty-stream '())
(define stream-null? null?)
(define (stream-car stream) (car stream))
(define (stream-cdr stream) (force (cdr stream)))

; section 3.5
(define (stream-ref s n)
  (if (= n 0)
      (stream-car s)
      (stream-ref (stream-cdr s) (- n 1))))

;(define (stream-map proc s)
;  (if (stream-null? s)
;      the-empty-stream
;      (cons-stream (proc (stream-car s))
;                   (stream-map proc (stream-cdr s)))))

(define (stream-for-each proc s)
  (if (stream-null? s)
      'done
      (begin (proc (stream-car s))
             (stream-for-each proc (stream-cdr s)))))

(define (display-stream s)
  (stream-for-each display-line s))

(define (display-line x)
  (newline)
  (display x))

(define (stream-enumerate-interval low high)
  (if (> low high)
      the-empty-stream
      (cons-stream
       low
       (stream-enumerate-interval (+ low 1) high))))

(define (stream-filter pred stream)
  (cond ((stream-null? stream) the-empty-stream)
        ((pred (stream-car stream))
         (cons-stream (stream-car stream)
                      (stream-filter pred
                                     (stream-cdr stream))))
        (else (stream-filter pred (stream-cdr stream)))))

(define (memo-proc proc)
  (let ((already-run? false) (result false))
    (lambda ()
      (if (not already-run?)
          (begin (set! result (proc))
                 (set! already-run? true)
                 result)
          result))))

; exercise 3.50
(define (stream-map proc . argstreams)
  (if (stream-null? (car argstreams))
      the-empty-stream
      (cons-stream
       (apply proc (map stream-car argstreams))
       (apply stream-map
              (cons proc (map stream-cdr argstreams))))))

;;;SECTION 3.5.2
(define (add-streams s1 s2)
  (stream-map + s1 s2))

(define ones (cons-stream 1 ones))
(define integers (cons-stream 1 (add-streams ones integers)))

; exercise 3.54
(define (mul-streams s1 s2)
  (stream-map * s1 s2))

(define factorials (cons-stream 1 (mul-streams integers factorials)))

; exercise 3.55
(define (partial-sums S)
  (cons-stream (stream-car S) (add-streams (stream-cdr S)
                                           (partial-sums S))))

; execute
(define stream-ex (partial-sums integers))

(stream-ref stream-ex 0)
(stream-ref stream-ex 1)
(stream-ref stream-ex 2)
(stream-ref stream-ex 3)
(stream-ref stream-ex 4)
(stream-ref stream-ex 5)

크리에이티브 커먼즈 라이선스
Creative Commons License

글에 잘못된 점, 다른 점, 부족한 점이 있다면 지적해주세요.
댓글, 트랙백, 메일 모두 고맙습니다.

트랙백 주소 :: http://nosyu.pe.kr/trackback/1612

댓글을 달아 주세요

[로그인][오픈아이디란?]