流中的递归

时间:2013-02-25 10:25:59

标签: stream scheme racket lazy-sequences

我有代码

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

现在,我想定义一个流(add-ten),它可以获取流权并给出另一个流。所以,如果我称之为

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

会给'((10。2)(10。4)(10。8)(10。16)(10。32))。

1 个答案:

答案 0 :(得分: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))