Как составить список с генераторами в схеме - PullRequest
1 голос
/ 08 июня 2019

У меня проблемы с этой проблемой, потому что я не знаю, как составить список с рекурсивностью, используя генераторы. Идея состоит в том, чтобы создать функцию, которая получает генератор, который генерирует 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 голосов
/ 08 июня 2019

Так что-то вроде этого:

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

Не проверено.То, что это делает, составляет список в обратном порядке, содержащий правдивые предметы.Когда он получает ложный предмет, он останавливается и возвращает обратную сторону списка накопления.

0 голосов
/ 08 июня 2019

Ваши определения в порядке! Вам просто нужно правильно позвонить им, чтобы увидеть это.

> (define t (taking 10 (fib)))
> (t)
0
> (t)
1
> (t)
1
> (t)
2
> (t)
3
> (t)
5
>

UPDATE

(define (generator->list n g)
  (if (= n 0)
      '()
      (cons (g) (generator->list (- n 1) g))))

(generator->list 10 (fib))
...