我想获取一个较小的列表列表,并将每个小列表的第一个元素的副本添加到每个小列表的末尾。如果这没有任何意义,我会给你一个例子:
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)))))
这一直给我一个空结果,我不知道为什么。
答案 0 :(得分:1)
您的代码失败是因为您忘记了else
表达式中的cond
部分,以及您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
参数 - 为了处理列表,我们很少需要事先知道它的长度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))