2012-11-06 36 views
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)。

感謝您的任何幫助。

回答

1

那麼這是因爲每次func調用'()這是mylistlet範圍內的值。我們應該將新的列表值傳遞給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這將不太有效。

+0

感謝您的提示。 –