2017-04-07 20 views
0

私の関数は(a a b b c c)を返しますが、(a(b c))となるようにリスト内のすべての項目を複製する関数を書いています。内部リスト構造を保持するにはどうすればよいですか?ここに私の現在のコードは次のとおりです。複製時のリスト構造を維持する

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

それを "重複リスト内のすべての項目は、" それは ''(A(B c)は(B cを))を返すべきではありませんか? – jakeehoffmann

+0

おそらく私はできるだけ言葉を言いませんでしたが、リスト内の各項目を複製したい – user1775500

答えて

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

浅いコピー:

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

そしてもちろんmapのは1つのlist引数のために、このようなものです:

(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))))))) 
関連する問題