方案:就实施扁平化提供建议

时间:2011-02-24 12:12:50

标签: list functional-programming scheme flatten

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))))))

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

4 个答案:

答案 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?可能会在vectorstring返回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)