SICP 全笔记

Exercise 3.58. Give an interpretation of the stream computed by the following procedure:

(define (expand num den radix)
  (cons-stream
   (quotient (* num radix) den)
   (expand (remainder (* num radix) den) den radix)))

(Quotient is a primitive that returns the integer quotient of two integers.) What are the successive elements produced by (expand 1 7 10) ? What is produced by (expand 3 8 10) ?

只要 radix 的地方为 10,这个 expand 所得到的序列就是 num * radix / den 的带小数的商–stream-car 是商小数点之前的部分,之后的 stream-cdr 是小数点之后的部分。

(load "stream.scm")

(define (expand num den radix)
  (cons-stream
   (quotient (* num radix) den)
   (expand (remainder (* num radix) den) den radix)))


;;; tests begin
(load "../testframe.scm")

; 10.0 / 7 = 1.4285714285714286
(let ((get10/7 (expand 1 7 10)))
  (assert= (stream-car get10/7) 1)
  (assert= (stream-ref get10/7 1) 4)
  (assert= (stream-ref get10/7 2) 2)
  (assert= (stream-ref get10/7 6) 1))

; 30.0 / 8 = 3.75
(let ((get30/8 (expand 3 8 10)))
  (assert= (stream-ref get30/8 0) 3)
  (assert= (stream-ref get30/8 1) 7)
  (assert= (stream-ref get30/8 2) 5)
  (assert= (stream-ref get30/8 3) 0))