我想使用以下定义创建序列:
(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)。
感谢您的帮助。
答案 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}},这样效果会更差。