我正在编写一个复制列表中所有项目的函数,因此像(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)) )
)
))
答案 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)))))))