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)を与えます。

ここで、ストリームパワーを取得して別のストリームを提供できるストリーム(add-ten)を定義したいので、それを呼び出すと

(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 に答える