2016-09-17 121 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'。條件中的「燈」部分沒有效果。 –