#### 41 lines 1.2 KiB Scheme Raw Permalink Blame History

 ``` ``` ```(load "stream.scm") ``` ``` ``` ```; ``` ```; Given a continued fraction in the form of a stream of ``` ```; integers, return the stream of convergents. (The stream ``` ```; actually returns a list (num denom quotient) ). ``` ```; ``` ``` ``` ```(define (cf->convergents cf-stream) ``` ``` (define (produce n-2 n-1 rest) ``` ``` (let ((nextval (+ (* n-1 (stream-car rest)) n-2))) ``` ``` (cons-stream nextval (produce n-1 nextval (stream-cdr rest))))) ``` ``` (define (cf-num cf-stream) ``` ``` (let* ((a0 (stream-car cf-stream)) ``` ``` (a1 (stream-car (stream-cdr cf-stream))) ``` ``` (n1 (+ (* a0 a1) 1)) ``` ``` (rest (stream-cdr (stream-cdr cf-stream)))) ``` ``` (cons-stream a0 (cons-stream n1 (produce a0 n1 rest))))) ``` ``` (define (cf-denom cf-stream) ``` ``` (let ((a0 1) ``` ``` (a1 (stream-car (stream-cdr cf-stream))) ``` ``` (rest (stream-cdr (stream-cdr cf-stream)))) ``` ``` (cons-stream a0 (cons-stream a1 (produce a0 a1 rest))))) ``` ``` (stream-map (lambda (n d) (list n d (/ n d))) ``` ``` (cf-num cf-stream) ``` ``` (cf-denom cf-stream))) ``` ``` ``` ```(define ones (cons-stream 1 ones)) ``` ```(define twos (cons-stream 2 twos)) ``` ```(define onetwo (interleave ones twos)) ``` ``` ``` ```(display-stream-n ones 5) ``` ``` ``` ```(display-stream-n (cf->convergents ones) 40) ``` ``` ``` ```(display (/ (+ 1 (sqrt 5)) 2)) ``` ``` ``` ```(display-stream-n (cf->convergents twos) 10) ``` ```(display-stream-n (cf->convergents onetwo) 10) ```