List 计划列表中的重复项

List 计划列表中的重复项,list,scheme,double,racket,List,Scheme,Double,Racket,我正在尝试使用Scheme复制列表中的所有条目: 这是我的代码: (define double (lambda (l) (cond [(null? l) '()] [(not (pair? l)) (list l l)] [else (cons (double (car l)) (double (cdr l)))]))) 如果我的输入是(double'(a((b)(cd)(((e)(()((b)))),我将返回((a)((b))((c)(dd

我正在尝试使用Scheme复制列表中的所有条目:

这是我的代码:

(define double
  (lambda (l)
    (cond [(null? l) '()]
          [(not (pair? l)) (list l l)]
          [else (cons (double (car l)) (double (cdr l)))])))
如果我的输入是
(double'(a((b)(cd)(((e)(()((b))))
,我将返回
((a)((b))((c)(dd))(((e()()))

我想得到
(aa((bb)(cdcd)(((e);))


我该怎么做?如果我用
append
list
替换
cons
,它会把事情搞得更糟。我只能使用你在上面看到的命令和命令,比如
let
(以及let的其他变体),
map
atom
if
和其他逻辑运算符。

第二个条件必须处理得稍微不同,这样才能工作,本质上,我们必须在到达原子时停止,但是当我们到达一个第一个元素是原子的列表时,我们可以根据需要重新生成输出列表。试试这个:

(define double
  (lambda (l)
    (cond [(null? l) '()]
          [(not (pair? (car l)))
           (cons (car l)
                 (cons (car l)
                       (double (cdr l))))]
          [else (cons (double (car l))
                      (double (cdr l)))])))
现在它如预期的那样工作:

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

注意:您希望复制树(而不是列表)中的元素。单词list表示一个级别。单词树意味着您希望复制所有级别上的元素。