我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))))))
除了明显的冗长之外,我的代码还有什么问题?
答案 0 :(得分:1)
我试试这个:
(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)))))
答案 1 :(得分:1)
我认为atom?
是错误的。您想知道lst
是否为列表,因此请使用list?
。对于某些实现,atom?
可能会在vector
或string
返回false。但我不确定。其余的都很好。
答案 2 :(得分:0)
这样的事情怎么样:
(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)
这样做你想要的吗?
答案 3 :(得分:0)
这样的事情如何?
(define (flatten x y)
(if (null? x)
y
(if (list? (car x))
(flatten (append (car x) (cdr x)) y)
(flatten (cdr x) (append y (list (car x)))))))
(define (flat x)
(flatten x '()))
> (flat '(1(2(3(4(5)6)7)8)9))
(1 2 3 4 5 6 7 8 9)
和关闭版本:
(define (flatten x)
(define (flatten x y)
(if (null? x)
y
(if (list? (car x))
(flatten (append (car x) (cdr x)) y)
(flatten (cdr x) (append y (list (car x)))))))
(flatten x '()))
> (flatten '(1(2(3(4(5)6)7)8)9))
(1 2 3 4 5 6 7 8 9)