的提示是,如果列表不null?
,你不應該着眼於中flat
通過列表的長度,而是請檢查列表的car
是否是列表本身或只是一個原子。如果它本身就是一個列表,那麼你想要將它變平,並且將列表中的cdr
弄平。
編輯:好,考慮兩種不同的情況,一個在您使用cons
和一個在您使用append
會發生什麼:
(append '(a b c) '(d e f)) => (a b c d e f)
(cons '(a b c) '(d e f)) => '((a b c) d e f)
在第一種情況下,你會得到一個平坦的列表回來,在第二種情況下,你沒有得到一個平面列表。然後,您可以嘗試
(define (bad-flatten lst)
(if ((null? lst)
'()
(append (car (flatten lst)) (cdr (flatten lst)))))
但如果的car
lst
不是列表將無法正常工作。您需要第三個案例,使用cond
,如下所示:
(define (incomplete-flatten lst)
(cond ((null? lst)
'())
((list? (car lst))
(append (flatten (car lst)) (flatten (cdr lst))))
(else
;; you need to do something different here. I can
;; think of at least two options.
)))
如果列表長度爲1它仍然看起來像'((1))',因此必須是'flat'-tened – Dirk 2009-09-25 13:04:54
哦不對......忘了 – Jonathan 2009-09-25 13:11:26