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 (生成 f4 10)时,它会产生 (#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的结果是获得“自然”的顺序或使用appendcons会不太有效。

于 2012-11-06T23:35:09.573 回答