我有一个递归函数给我这个答案:
'((()) (((((a c d f e d))))) (((((a c d e f d))))))
除了我需要查看函数以便清理它之外,这引出了一个问题:如何清理这个答案?如何“解嵌”这些列表以便返回:
'((a c d f e d) (a c d e f d))
我需要在Racket或Common Lisp中使用一些策略或适当的功能。
提前致谢!
答案 0 :(得分:5)
您想要的行为有点不清楚 - 如果您只是想要压缩列表,在Racket中,您只需使用flatten
函数:
> (flatten '((()) (((((a c d f e d))))) (((((a c d e f d)))))))
'(a c d f e d a c d e f d)
但是,您似乎想要展平每个子列表,在这种情况下,您只想使用与map
配对的flatten
:
> (map flatten '((()) (((((a c d f e d))))) (((((a c d e f d)))))))
'(() (a c d f e d) (a c d e f d))
然而,这仍然留下第一个空列表,在您的问题中,它看起来像您要删除。在这种情况下,我只需在展平后添加一个filter
步骤:
> (filter (negate empty?) (map flatten '((()) (((((a c d f e d))))) (((((a c d e f d))))))))
'((a c d f e d) (a c d e f d))
你可以将它包装成一个具有你想要的行为的简单函数:
(define (flatten-non-empty-sublists lst)
(filter (negate empty?) (map flatten lst)))
答案 1 :(得分:3)
在常见的lisp中,您可以从alexandria获取flatten
函数,您可以从quicklisp获取该函数。