hal*_*l88 6 recursion scheme list nested-lists flatten
说我有这个清单: (a b ((c)) (d + e) ((e + f)) (g) () h)
如何获得以下列表(最好带有功能):(a b c (d + e) (e + f) g h)
换一种说法:
如果嵌套列表只有一个元素,则将其简化为元素.((c))在上面的例子中,这简化为c.也((e + f))变成了(e + f).
如果嵌套列表包含多个元素,则它保持不变.这(d + e)仍然(d + e)如上例所示.
如果嵌套列表为null,则只删除它.
最后,我不确定在这种情况下flatten一词是否适用.我希望我的问题很明确.如果没有,请告诉我.
提前致谢!
试试这段代码:
(define (atom? x)
(and (not (pair? x)) (not (null? x))))
(define (strip lst)
(if (or (null? lst) (atom? lst) (not (null? (cdr lst))))
lst
(strip (car lst))))
(define (flatten lst)
(cond ((or (null? lst) (atom? lst))
lst)
((null? (strip (car lst)))
(flatten (cdr lst)))
(else
(cons (flatten (strip (car lst))) (flatten (cdr lst))))))
Run Code Online (Sandbox Code Playgroud)
在使用您的示例进行测试时,它会给出预期的答案:
> (flatten '(a b ((c)) (d + e) ((e + f)) (g) () h))
> (a b c (d + e) (e + f) g h)
Run Code Online (Sandbox Code Playgroud)