递归添加到列表返回null
问题描述:
我想获取一个小列表的列表,并将每个小列表的第一个元素的副本添加到每个小列表的末尾。如果没有任何意义,我给你举个例子:递归添加到列表返回null
f({(0,0,1),(1,0,0),(0,1,0),... ...})= {(0,0,1,0),(1,0,0,1),(0,1,0,0),...}
这就是我所得到的到目前为止:
(define (add-end n set)
(cond
((null? set) '())
(cons (append (first set) (first (first set)))
(add-end n (rest set)))))
这不断给我一个空结果,我不完全知道为什么。
答
您的代码失败,因为您忘记了cond
表达式中的else
部分,而且您的appending
单元素到列表末尾的方式不正确。这应该可以解决的问题:
(define (add-end set)
(cond ((null? set)
'())
(else
(cons (append (first set) (list (first (first set))))
(add-end (rest set))))))
别急,还有更简单的解决方案,如果我们使用现有程序:
(define (add-end set)
(map (lambda (lst)
(append lst (list (first lst))))
set))
说明:
- 我们不需要一个
n
参数 - 为了处理列表,我们很少必须事先知道它的长度 - 请注意,我们必须将输入列表的每个元素处理为c reate新的输出列表,使用
map
就是这样,在这些情况下 - 去现在它是
append
荷兰国际集团各列表 - 要建立一个适当的列表的第一个元素一件简单的事情,记得
append
要求它的两个参数是列表,解释与(list (first lst))
不管怎样位,它按预期工作:
(add-end '((0 0 1) (1 0 0) (0 1 0)))
=> '((0 0 1 0) (1 0 0 1) (0 1 0 0))
我现在看到。之前给我的是什么? – CompNoob
@CompNoob它失败了,因为你忘了'else'。条件中的“灯”部分没有效果。 –