List 计划列表中的重复项
我正在尝试使用Scheme复制列表中的所有条目: 这是我的代码: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
(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表示一个级别。单词树意味着您希望复制所有级别上的元素。