2016-03-03 78 views
1

我正在用球拍寫複印機功能。複製器函數採用符號和數字L的嵌套列表,並通過在所有級別「立即複製」每個原子(符號或數字)來產生符號和數字的嵌套列表。 (a 1 bb 2 2 cc 3 3), 例如: (複製者'(a 1 b 2 c 3))產生(a 1 1 bb 2 2 cc 3 3), (複製者'((a 1)b((c))2) 。AA 1 1)BB((CC))2 2)球拍複印機功能

這是我的功能:

(define (duplicator ls) 
    (if (null? ls) 
     '() 
     (cons (car ls) 
      (cons (car ls) 
        (duplicator (cdr ls)))))) 

我的問題是(複印機「((1)b((C輸出))2))是'((a 1)(a 1)bb((c))((c))2 2),這並不是我想要的。 ?

+0

您需要條件對,如果當前元素本身是一個列表或者沒有其他的解決方案。如果是的話,它不應該重複,但遞歸調用與內部列表作爲參數的重複函數。只有當你處於最低級時,纔會發生重複。我並不熟悉Racket語法,但我會盡力弄清楚。 –

回答

1

這是一個解決方案:

(define (duplicator ls) 
    (cond ((null? ls) '()) 
     ((list? (car ls)) (cons (duplicator (car ls)) (duplicator (cdr ls)))) 
     (else (cons (car ls) (cons (car ls) (duplicator (cdr ls))))))) 

(duplicator '((a 1) b ((c)) 2)) ; produces ((a a 1 1) b b ((c c)) 2 2) 
0

下面是一個使用了foldr高階程序

(define (duplicator xs) 
    (foldr (λ (x ys) 
      (if (list? x) 
       (cons (duplicator x) ys) 
       (cons x (cons x ys)))) 
     empty 
     xs)) 

(duplicator '((a 1) b ((c)) 2)) 

; => '((a a 1 1) b b ((c c)) 2 2)