Scheme 复制时维护列表结构
我正在编写一个函数来复制列表中的所有项,这样像(a(bc))这样的列表就变成了(aa(bc)),但是我的函数返回(aa)。如何确保保留内部列表结构?这是我目前的代码: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)) )
(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))
?也许我没有尽可能地表达它,但我希望它复制列表中的每个项目