vx-scheme/testcases/cf.scm

41 lines
1.2 KiB
Scheme

(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)