2016-09-17 80 views
2

我想获取一个小列表的列表,并将每个小列表的第一个元素的副本添加到每个小列表的末尾。如果没有任何意义,我给你举个例子:递归添加到列表返回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))))) 

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

回答

1

您的代码失败,因为您忘记了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)) 
+0

我现在看到。之前给我的是什么? – CompNoob

+0

@CompNoob它失败了,因为你忘了'else'。条件中的“灯”部分没有效果。 –