在方案中生成序列

时间:2012-11-06 23:02:28

标签: scheme

我想使用以下定义创建序列:

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

之所以会发生这种情况,是因为每次使用func调用'()时,mylist范围内let的值都是generate。我们应该将新的列表值传递给(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代替{{1}},这样效果会更差。