如何在Scheme中使用生成器列出清单

时间:2019-06-08 20:09:50

标签: scheme racket

我遇到了这个问题,因为我不知道如何使用生成器来递归地创建一个列表。这个想法是创建一个函数,该函数接收生成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))))))

2 个答案:

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

未经测试。这是建立一个反向列出真实项目的列表。当它得到一个伪造的物品时,它将停止并返回累积列表的反面。