Scheme中的书写扁平化方法

Scheme中的书写扁平化方法,scheme,Scheme,我一直在研究下面的函数flatte,到目前为止,它只适用于列表。我想知道是否有人能为我提供一些关于如何让它与配对工作的见解?例如(展平’(a.a))将返回(a)。谢谢 这里有一个选择: (define (flatten x) (cond ((null? x) '()) ((pair? x) (append (flatten (car x)) (flatten (cdr x)))) (else (list x)))) 这就是您想要的,不需要追加,使其成为o(n

我一直在研究下面的函数flatte,到目前为止,它只适用于列表。我想知道是否有人能为我提供一些关于如何让它与配对工作的见解?例如(展平’(a.a))将返回(a)。谢谢

这里有一个选择:

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

这就是您想要的,不需要追加,使其成为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)))))
(a.a)
扁平化为
(a)
似乎是错误的,因为这实际上引入了一个额外的级别,而不是降低它。
(define (flatten l)
  (cond
    [(empty? l) empty]
    [(list? l)
     (append (flatten (first l))
             (flatten (rest l)))]
    [else (list l)]))
(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)))))