递归添加到列表返回null

时间:2016-09-17 15:26:34

标签: recursion scheme racket

我想获取一个较小的列表列表,并将每个小列表的第一个元素的副本添加到每个小列表的末尾。如果这没有任何意义,我会给你一个例子:

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)))))

这一直给我一个空结果,我不知道为什么。

1 个答案:

答案 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))