如何将列表中的每个元素写入两次,以便:
(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 :(得分: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)))))