我正在尝试使用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)(c d)(((e))))))
,我会回来((a a) (((b b)) ((c c) (d d)) ((((e e))))))
。
我想获得(a a((b b)(c c d d)(((e e)))))
。
我该怎么做?如果我将cons
替换为append
或list
,则会更加混乱。我只能使用您在那里看到的命令以及let
(以及let的其他变体),map
,atom
,if
和其他逻辑运算符等命令。< / p>
答案 0 :(得分:1)
第二个条件的处理方式有点不同,实际上,当我们到达一个原子时,我们必须停止它,但是当我们到达一个第一个元素是原子的列表时 - 我们可以这样做根据需要重建输出列表。试试这个:
(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)))))