2013-11-23 80 views
1

我試圖將給定變量x添加到列表L。這兩者都是功能ADDV的參數。我到目前爲止的代碼如下:將值添加到列表的最後一個索引(LISP)

(defun addV(L x) 
    (cond 
     ((eq L nil)  nil) 
     ((eq (cdr L) nil) (list(+(car L) x))) 
     (+ x (first(last L))) 
     (butlast L) 
     (append L x))) 

隨着參數

L = '(1 2 3 4) 
x = 2 

當語句:(+ x (first(last L))))評估,它的價值是4。最終目標應該是 L = '(1 2 3 6)

我不知道我在做什麼錯。任何幫助將不勝感激。謝謝。

+0

如果從(1 2 3 4)得到(1 2 3 6),它似乎並不像_replace_那麼多。 –

+0

啊,我誤讀了,你想給最後一個元素添加一個值,並替換。 –

回答

2

您的代碼格式不正確。重新縮進,我們得到

(defun addV(L x) 
    (cond 
     ((eq L nil)  
      nil) 
     ((eq (cdr L) nil) 
      (list (+ (car L) x))) 
     (+ 
      x 
      (first (last L))) 
     (butlast 
      L) 
     (append 
      L 
      x))) 

你現在看到問題了嗎?

由於(not +)NIL,因此輸入COND表中的相應子句。評估其身體形態(x(first (last L)))的效果,其中沒有。然後返回最後一個表單的值。

什麼,你顯然希望它是,是

(defun addV (L x) 
    (cond 
     ((eq L nil)  
      nil) 
     ((eq (cdr L) nil) 
      (list (+ (car L) x))) 
     (T 
      (append 
       (butlast L) 
       (list (+ x (first (last L)))))))) 

巧合的是,第二條是完全不必要的,可能只是被省略,使得它

(defun addV (L x) 
    (if (not (null L)) 
     (append (butlast L) 
       (list (+ x (first (last L))))))) 
+0

哦,是的,我知道。感謝您的幫助! – MCPartington

2

如果你能做到這一點破壞性,那麼你可以使用incflast

(defun increment-last (list x) 
    (prog1 list ; return the list 
    (incf (first (last list)) x))) 

如果您確實需要創建一個新列表,您必須走到列表的最後才能看到最後一個元素。當你這樣做,你可以跟蹤你已經看到的元素(以相反的順序),有效地使用相反的順序列表,以構建新的列表中,您使用nreconc爲:

(defun plus-last (list x) 
    (do ((list list (rest list)) 
     (rhead '() (list* (first list) rhead))) 
     ((endp (rest list)) 
     (nreconc rhead (list (+ x (first list))))))) 
CL-USER> (plus-last '(1 2 3 4) 2) 
(1 2 3 6) 

如果你不與do語法很舒服,你可以使用一個尾遞歸函數,太(其中一些Common Lisp的實現可以優化成一個圈):

(defun plus-last (list x) 
    (labels ((pl (list rhead) 
      (if (endp (rest list)) 
       (nreconc rhead (list (+ x (first list)))) 
       (pl (rest list) 
        (list* (first list) rhead))))) 
    (pl list '()))) 

你ç也烏爾德使用loop,並表達邏輯非常清楚:

(defun plus-last (list x) 
    (loop for (a . b) on list  
    if (null b) collect (+ a x) 
    else collect a)) 

這也與maplist來完成:

(defun plus-last (list x) 
    (maplist (lambda (list) 
      (if (endp (rest list)) 
       (+ x (first list)) 
       (first list))) 
      list)) 
相關問題