我的flatten实现如下所示:
(define flatten
(lambda (lst)
(if (null? lst)
lst
(append
(rtn-lst (car lst))
(flatten (cdr lst))))))
(define rtn-lst
(lambda (lst)
(cond
((null? lst)
empty)
((atom? lst)
(list lst))
(else
(flatten lst)))))而标准实现是:
(define (flatten lst)
(cond
((null? list)
empty)
((list? (car lst))
(append (flatten (car lst)) (flatten (cdr lst))))
(else
(cons (car lst) (flatten (cdr lst))))))除了明显的冗长之外,我的代码还有什么问题?
发布于 2011-02-24 20:40:05
我会试试这个:
(define rtn-lst
(lambda (lst)
(cond
((list? lst)
(if (null? lst)
empty
(flatten-list lst)))
((atom? lst)
(list lst))
(else
(flatten-list lst)))))可能我们有不同的Scheme实现。
编辑:
使用修改后的else分支:
(define rtn-lst
(lambda (lst)
(cond
((list? lst)
(if (null? lst)
empty
(flatten-list lst)))
(else
(list lst)))))发布于 2011-02-24 21:16:15
我会认为atom?是错的。您想知道lst是否是一个列表,所以使用list?。对于某些实现,atom?可能会在vector或string上返回false。但我不能确定。剩下的都是好的。
发布于 2015-01-27 17:58:48
这样如何:
(define foo
(lambda (e)
(cond ((pair? e) `(,@(foo (car e)) ,@(foo (cdr e))))
((null? e) '())
(else (list e)))))其中,例如:
> (foo '(((2 3) (4 . 5) 8)))
(2 3 4 5 8)这是你想要的吗?
https://stackoverflow.com/questions/5104479
复制相似问题