Scheme 复制时维护列表结构

Scheme 复制时维护列表结构,scheme,racket,Scheme,Racket,我正在编写一个函数来复制列表中的所有项,这样像(a(bc))这样的列表就变成了(aa(bc)),但是我的函数返回(aa)。如何确保保留内部列表结构?这是我目前的代码: (define double (lambda (l) (cond ((null? l) '()) ((list? l) (append (double (car l)) (double (cdr l)))) (else (append (list l) (list l)) )

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

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

要保留列表的结构,必须避免使用
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)))

要保留列表的结构,必须避免使用
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)))
浅拷贝:

(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 '()))
这就是
累积树
的制作方法:

(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)))))))
浅拷贝:

(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 '()))
这就是
累积树
的制作方法:

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

如果它“复制列表中的所有项目”,它不应该返回
(aa(bc)(bc))
?也许我没有尽可能地表达它,但我希望它复制列表中的每个项目如果它“复制列表中的所有项目”,它不应该返回
(aa(bc)(bc))
?也许我没有尽可能地表达它,但我希望它复制列表中的每个项目