的提示是,如果列表不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