首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方案:对flatten的实施提供建议

方案:对flatten的实施提供建议
EN

Stack Overflow用户
提问于 2011-02-24 20:12:50
回答 4查看 4.1K关注 0票数 0

我的flatten实现如下所示:

代码语言:javascript
复制
(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)))))

而标准实现是:

代码语言:javascript
复制
(define (flatten lst)
  (cond 
    ((null? list)
      empty)
    ((list? (car lst))
      (append (flatten (car lst)) (flatten (cdr lst))))
    (else
      (cons (car lst) (flatten (cdr lst))))))

除了明显的冗长之外,我的代码还有什么问题?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-02-24 20:40:05

我会试试这个:

代码语言:javascript
复制
(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分支:

代码语言:javascript
复制
(define rtn-lst
  (lambda (lst)
    (cond 
      ((list? lst)
        (if (null? lst)
            empty
            (flatten-list lst)))
      (else 
        (list lst)))))
票数 1
EN

Stack Overflow用户

发布于 2011-02-24 21:16:15

我会认为atom?是错的。您想知道lst是否是一个列表,所以使用list?。对于某些实现,atom?可能会在vectorstring上返回false。但我不能确定。剩下的都是好的。

票数 1
EN

Stack Overflow用户

发布于 2015-01-27 17:58:48

这样如何:

代码语言:javascript
复制
(define foo
  (lambda (e)
    (cond ((pair? e) `(,@(foo (car e)) ,@(foo (cdr e))))
          ((null? e) '())
          (else (list e)))))

其中,例如:

代码语言:javascript
复制
> (foo '(((2 3) (4 . 5) 8)))
(2 3 4 5 8)

这是你想要的吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5104479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档