如何在Scheme中列出生成器

如何在Scheme中列出生成器,scheme,racket,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 (+

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

你的定义很好!你只需要正确地打电话给他们就可以看到了

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

你的定义很好!你只需要正确地打电话给他们就可以看到了

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

比如说:

(define (to-list gen)
  (let loop ((l '()))
    (let ((r (gen)))
      (if r
        (loop (cons r l))
        (reverse! l)
      ))))

未经测试。这样做的目的是建立一个与真实项目相反的列表。当它得到一个错误的项目时,它会停止并返回与累加列表相反的结果。

所以类似这样:

(define (to-list gen)
  (let loop ((l '()))
    (let ((r (gen)))
      (if r
        (loop (cons r l))
        (reverse! l)
      ))))

未经测试。这样做的目的是建立一个与真实项目相反的列表。当它得到一个falsy项目时,它会停止并返回累加列表的相反方向。

是的,但问题是如何用这些数字创建一个列表,例如(0 1 1 2 3 5)@BastianMartinez我在列表示例中添加了一个生成器。最后一个问题,它怎么可能是一个生成列表但只接收生成器的函数。我很感激你的回答。我不确定我是否明白。你能用另一种方式问吗?当然,问题是:函数如何接收my generator(fib)并生成包含生成的数字的列表。示例:(gen->list(fib))输出:(011235…n)是的,但问题是如何用这些数字制作列表,例如(011235)@BastianMartinez我在列表示例中添加了一个生成器。最后一个问题,它怎么可能是一个生成列表但只接收生成器的函数。我很感激你的回答。我不确定我是否明白。你能用另一种方式问吗?当然,问题是:函数如何接收my generator(fib)并生成包含生成的数字的列表。示例:(gen->list(fib))输出:(01 1 2 3 5…n)