我遇到了这个问题,因为我不知道如何使用生成器来递归地创建一个列表。这个想法是创建一个函数,该函数接收生成n个数字的生成器,并返回包含这些数字的列表。
这是我的代码
;GENERATOR THAT GENERATES "INFINITE NUMBERS OF FIBONACCI"
(define (fib)
(let ((a 0) (b 1))
(lambda ()
(let ((ret a))
(set! a b)
(set! b (+ ret b))
ret))))
;RETURNS A GENERATOR THAT GENERATES NUMBERS OF FIBONACCI UP TO N
(define (taking n g)
(let ((i 1))
(lambda ()
(if (> i n)
#f
(begin
(set! i (+ i 1))
(g))))))
答案 0 :(得分:0)
您的定义很好!您只需要给他们正确的电话即可看到它。
> (define t (taking 10 (fib)))
> (t)
0
> (t)
1
> (t)
1
> (t)
2
> (t)
3
> (t)
5
>
更新
(define (generator->list n g)
(if (= n 0)
'()
(cons (g) (generator->list (- n 1) g))))
(generator->list 10 (fib))
答案 1 :(得分:0)
是这样的:
(define (to-list gen)
(let loop ((l '()))
(let ((r (gen)))
(if r
(loop (cons r l))
(reverse! l)
))))
未经测试。这是建立一个反向列出真实项目的列表。当它得到一个伪造的物品时,它将停止并返回累积列表的反面。