2014-11-08 38 views
0

我怎样写列表中的每个元素两次这样的:如何在计划中编写此程序?

(double '(a((b)(c d)(((e)))))) --> '(a a((b b)(c c d d)(((e e))))) 

我现在有这到目前为止,但它并不完全正确。

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

*每*元素..难道这不是量'(AA((BB)(BB)(CCDD)(CCDD )((ee)(ee))((ee)(ee)))((ee)(ee))((ee)(ee)))((bb)(bb)(ccdd)(ccdd) )(((EE)(EE))(量值(ee)(ee值)))(((EE)(EE))(量值(ee)(ee值)))))'? – Sylwester 2014-11-08 21:10:55

回答

1

你是接近的答案,关键的一点是,我们必须在列表的car是原子,而不是当列表本身是一个原子,这样我们可以修改的元素翻番我们正在建立的输出列表。这里有一个固定的版本:

(define double 
    (lambda (x) 
    (cond ((null? x) '()) 
      ((list? (car x)) ; ask about the car of the list. It's better to use pair? 
      (cons (double (car x)) ; use cons, not append 
       (double (cdr x)))) 
      (else (cons (car x) (cons (car x) (double (cdr x)))))))) ; double the car 

它按预期工作:

(double '(a ((b) (c d) (((e)))))) 
=> '(a a ((b b) (c c d d) (((e e)))))