瞭解遞歸函數的最佳策略是與sligthly比端子一個更復雜的情況下嘗試。所以,讓我們試試n=1
。
在這種情況下,該函數變爲:
(append (map (lambda (k) (cons 0 k)) (all-lists 0))
(map (lambda (k) (cons 1 k)) (all-lists 0))
那就是:
(append (map (lambda (k) (cons 0 k)) '(()))
(map (lambda (k) (cons 1 k)) '(())))
所以,第一個map
應用功能(lambda (k) (cons 0 k))
到列表'(()))
,它只有中的所有元素元素'()
,生成'((0))
(該列表包含由,0
和空列表獲得的元素),並以相同的方式第二張地圖產生'((1))
。 這些列表附在一起產生列表'((0) (1))
,換句話說,所有長度爲1的列表以及所有可能的組合0
和1
。
在n=2
的情況下,遞歸情況下被施加到'((0) (1))
:使第一地圖把一個0
所有元素之前,獲得'((0 0) (0 1))
,而所述第二地圖生成'((1 0) (1 1))
。如果將這兩個列表附加在一起,則獲得'((0 0) (0 1) (1 0) (1 1))
,這是所有可能組合的列表,長度爲2,0
和1
。
等等,等等...
實際上,功能不明確的,因爲它在每個遞歸計算(all-lists (- n 1))
兩次不必要的價值,所以翻番的工作,這已經是指數。
(define all-lists
(lambda (n)
(if (= n 0)
'(())
(let ((a (all-lists (- n 1))))
(append (map (lambda (k) (cons 0 k)) a)
(map (lambda (k) (cons 1 k)) a))))))