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