流中的递归



我有代码

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

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

现在,我想定义一个流(加10(,它可以取流的幂,并给出另一个流。所以,如果我称之为

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

会给出’(10。2( (10。4( (10。8( (10。16( (10。32((。

试试这个:

(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定义的末尾调用它,也可以在将其传递给add-ten之前这样调用它:(powers)。修复此问题,它按预期工作:

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

相关内容

  • 没有找到相关文章

最新更新