我如何在计划中编写此程序?

时间:2014-11-08 03:34:04

标签: functional-programming scheme

如何将列表中的每个元素写入两次,以便:

(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 '()))))))

1 个答案:

答案 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)))))