0

以下の定義を使用してシーケンスを作成したいと思います。

(define f1 (lambda (x) #t))
(define f2 (lambda (x) #f))             
(define f3 (lambda (x) (if (null? x) #t (car x))))
(define f4 (lambda (x) (if (null? x) #t (not (car x)))))

私のコードは次のとおりです。

(define (generate func n)
       (let ((mylist '()))
       (if (= n 0) mylist
        (cons (func mylist) (generate func (- n 1)))                
   )))

f1 f2 と f3 のトリックを実行しますが、(f4 10 を生成) のように f4 を試行すると、(#t #t #t #t #t #t #t #t #t #t) が生成されます (#t # f #t #f #t #f #t #f #t #f)。

助けてくれてありがとう。

4

1 に答える 1

1

これは、スコープ内の値である毎回funcが呼び出されるために発生します。新しいリストの値を次の呼び出しに渡して、何か役に立つことを行う必要があります。このようなもの'()mylistletgenerate

(define (generate f n)
  (define (generate-int n lst)
    (if (= n 0) 
        lst
        (generate-int (- n 1) (cons (f lst) lst))))

  (generate-int n (list)))

(generate f4 4)最初に生成'(#f #t #f #t)された値がリストの最後に来るようになりました。reverse「自然な」順序を取得したり、代わりに使用しappendたりするconsと、効果が低下する可能性があります。

于 2012-11-06T23:35:09.573 に答える