1

我有代码

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

现在,我想定义一个流(加十),它可以获取流的权力并提供另一个流。所以,如果我称之为

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

将给出'((10. 2) (10. 4) (10. 8) (10. 16) (10. 32))。

4

1 回答 1

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))
于 2013-02-25T14:41:37.583 回答