2013-02-25 4 views
1

У меня есть кодрекурсии в потоке

(define (add-ten s) 
(let ([f (lambda(s) ((cons 10 (car (s))) (cdr (s))))]) 
(f s))) 

ы может быть потоком, как полномочия

(define powers (letrec ([f (lambda (x) (cons x (lambda() (f (* x 2)))))]) 
(lambda () (f 2)))) 

Моя функция

(result-for-n-times powers 5) 

дает «(2 4 8 16 32) ,

Теперь я хочу, чтобы определить поток (добавить-десять), который может взять на поток силы и дает другой stream.So, если я называю это

(result-for-n-times (add-ten powers) 5) 

даст «((10. 2) (10. 4) (10. 8) (10. 16) (10. 32)).

ответ

0

Попробуйте это:

(define powers 
    (letrec ([f (lambda (x) 
       (cons x 
         (lambda() (f (* x 2)))))]) 
    (f 2))) 

(define (result-for-n-times s n) 
    (if (zero? n) 
     '() 
     (cons (car s) 
      (result-for-n-times ((cdr s)) (sub1 n))))) 

(define (add-ten s) 
    (letrec ([f (lambda (x) 
       (cons (cons 10 (car x)) 
         (lambda() (f ((cdr x))))))]) 
    (f s))) 

Обратите внимание, что add-ten процедура принимает поток в качестве параметра, но и он должен возвращать поток. Поэтому letrec должен использоваться для определения процедуры, которая согласуется с каждым элементом, взятым из исходного потока, с обещанием, которое продолжает создавать поток.

заметить также, что вы на самом деле не вызова процедуру, которая определяет powers, вы вызывайте его в конце powers »определение или вы называете это так: (powers) перед передачей его в add-ten. Исправлено это:

(result-for-n-times (add-ten powers) 5) 
=> '((10 . 2) (10 . 4) (10 . 8) (10 . 16) (10 . 32)) 
+0

Это также было одним из моих попыток, но дает мне сообщение об ошибке: не процедура; ожидаемая процедура, которая может быть применена к аргументам : '((10. 2). # ) аргументы ...: [нет] – Rea

+0

@Rea mmm, no. ошибка находится в 'powers'. Это правильная версия: '(define powers (letrec ([f (lambda (x) (cons x (lambda() (f (* x 2)))))]) (f 2)))' –

+0

Почему бы не просто добавьте ноль, как в реальной домашней работе? –