计划列表中的重复条目
Scheme duplicate entries in a list
我正在尝试使用方案复制列表中的所有条目:
这是我的代码:
(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
和其他逻辑运算符。
第二个条件必须以不同的方式处理才能起作用,本质上,我们必须不是在到达原子时停止,而是在到达其第一个元素是原子的列表时停止——以这种方式我们可以根据需要重建输出列表。试试这个:
(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)))))
我正在尝试使用方案复制列表中的所有条目:
这是我的代码:
(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
和其他逻辑运算符。
第二个条件必须以不同的方式处理才能起作用,本质上,我们必须不是在到达原子时停止,而是在到达其第一个元素是原子的列表时停止——以这种方式我们可以根据需要重建输出列表。试试这个:
(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)))))