Make a stream of all factorial numbers: 1 2 6 24 120 ...
Please go for a recursive definition, in the same style as used for nat-nums and fib:
(define ones (cons-stream 1 ones)) (define nat-nums (cons-stream 1 (add-streams ones nat-nums))) (define fibs (cons-stream 0 (cons-stream 1 (add-streams (tail fibs) fibs))))
As part of the solution, you may need a multiplicative stream function similar to add-streams. For that purpose make a higher-order function, combine-streams, that combines two (infinite) streams with a binary function.
Here are all the necessary definitions you need to get started:
(define-syntax cons-stream (syntax-rules () ((cons-stream x y) (cons x (delay y))))) (define head car) (define (tail stream) (force (cdr stream))) (define empty-stream? null?) (define the-empty-stream '()) (define (stream-section n stream) (cond ((= n 0) '()) (else (cons (head stream) (stream-section (- n 1) (tail stream)))))) (define (add-streams s1 s2) (let ((h1 (head s1)) (h2 (head s2))) (cons-stream (+ h1 h2) (add-streams (tail s1) (tail s2))))) (define ones (cons-stream 1 ones)) (define nat-nums (cons-stream 1 (add-streams ones nat-nums)))