在Scheme中编写flatten方法

时间:2011-12-05 15:22:24

标签: scheme

我一直致力于以下功能展平,到目前为止它只适用于列表。我想知道是否有人可以提供一些有关如何使用它的工作的见解?例如(flatten'(a .a))将返回(a a)。感谢。

(define (flatten list)
   (cond ((null? list) null)
         ((list? (car list)) (append (flatten (car list)) (flatten (cdr list))))
         (else
          (cons (car list) (flatten (cdr list))))))

3 个答案:

答案 0 :(得分:6)

这是一个选项:

(define (flatten x)
  (cond ((null? x) '())
        ((pair? x) (append (flatten (car x)) (flatten (cdr x))))
        (else (list x))))

答案 1 :(得分:1)

这可以做您想要的,而无需附加,使其变为o(n)。我像树上行走列表。如果列表嵌套太深,某些方案可能会引发堆栈溢出错误。狡猾的情况并非如此。

我对此代码没有版权。

(define (flatten lst)
  (let loop ((lst lst) (acc '()))
    (cond
     ((null? lst) acc)
     ((pair? lst) (loop (car lst) (loop (cdr lst) acc)))
     (else (cons lst acc)))))

答案 2 :(得分:0)

(define (flatten l)
  (cond
    [(empty? l) empty]
    [(list? l)
     (append (flatten (first l))
             (flatten (rest l)))]
    [else (list l)]))