2013-02-19 38 views
1

我想寫我自己的追加,爲一個元素添加到現有的列表。方案 - 編寫我自己的追加會產生一個奇怪的結果

我寫了以下內容:

(define (appendElem llist elem) 
    (if (null? llist) 
     elem 
     (cons (car llist) (appendElem (cdr llist) elem)))) 

但是當我這樣做:

(appendElem (list 1 2 30) 11) 

我得到:

(1 2 30 . 11) 

所以現在的問題是,爲什麼(1 2 30 . 11)而不是(1 2 30 11)

感謝

編輯:

修正:

(define (appendElem llist elem) 
    (if (null? llist) 
     (list elem) 
     (cons (car llist) (appendElem (cdr llist) elem)))) 

回答

5

想想你希望你的基本情況是什麼。你想只是elem,還是你想列表與單個項目elem?它們是有區別的。如果需要後者,則需要在代碼中修復基本情況。

換句話說,你想(appendElem '() 42)返回42(42)?仔細想想這個問題的答案,然後想想每個選擇的後果是什麼。順便說一下,雖然你可以實現appendElem作爲玩具,但你很快就會意識到該函數具有O(n)運行時。所以不要使用這種方法建立列表!建立列表的標準方式是cons項目,然後reverse最終生成列表。

+0

我想要一個列表,當然如此,我該如何解決它?謝謝 – ron 2013-02-19 05:53:10

+1

好的,完成了。謝謝 ! – ron 2013-02-19 05:56:25

1

下面是答案:

(define (appendElem llist elem) 
    (if (null? llist) 
     (list elem) 
     (cons (car llist) (appendElem (cdr llist) elem)))) 

感謝@克里斯小丑,年輕。

0

爲你的另一個建議:

(define (make-dl ls)  ; turn a list into a difference list 
    (cons ls (last-pair ls))) 

(define (snoc-dl! dl e) ; snoc ~ appendElem, destructively 
    (set-cdr! (cdr dl) (list e)) 
    (set-cdr! dl (cddr dl))) 

(define (dl-list dl)  ; get the list back 
    (car dl)) 

O(1)在列表的末尾追加(當然,調用make-dlO(n),但所有後續的追加將採取O(1)時間)。

相關問題