2016-03-03 71 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)