复制时维护列表结构

时间:2017-04-07 04:43:38

标签: scheme racket

我正在编写一个复制列表中所有项目的函数,因此像(a(b c))这样的列表变为(a a(b b c c)),但是我的函数返回(a a b b c c)。如何确保保留内部列表结构?这是我目前的代码:

(define double
  (lambda (l)
    (cond ((null? l) '())
          ((list? l) (append (double (car l)) (double (cdr l))))
          (else (append (list l) (list l)) )
    )
))

2 个答案:

答案 0 :(得分:2)

要保留列表的结构,您必须避免使用append。这是一个实现:

(define (double lst)
  (cond
    [(null? lst) empty]
    [(list? (car lst))
     (cons (double (car lst))
           (double (cdr lst)))]
    [else
     (cons (car lst) (cons (car lst)
           (double (cdr lst))))]))

例如,

> (double '(a (b c) ((a b) (c d))))
'(a a (b b c c) ((a a b b) (c c d d)))

答案 1 :(得分:0)

浅拷贝:

(define (copy-list lst)
  (map values lst))

当然map对于一个列表参数是这样的:

(define (map f lst)
  (if (null? lst)
      '()
      (cons (f (car lst))
            (map f (cdr lst)))))

深拷贝:

(define (copy-tree tree)
  (accumulate-tree tree values cons '()))

这就是accumulate-tree的制作方式:

(define (accumulate-tree tree term combiner null-value)
  (let rec ((tree tree))
    (cond ((null? tree) null-value)
          ((not (pair? tree)) (term tree))
          (else (combiner (rec (car tree)) 
                          (rec (cdr tree)))))))