2016-03-09 69 views
1

我是LISP的新手,我試圖創建一個遞歸函數,將列表中的元素配對。我被困在我的函數的最後部分加入遞歸。LISP遞歸配對?

(defun pairup (L) 
(cond((null L) nil)) 
(list (cons (car L) (cadr L)(pairup(cdr L))))) 

我知道,因爲它的第三個參數進入利弊(pairup(cdr L))))))會顯示一個錯誤。不知道如何在功能重新添加=/

輸入:(pairup'(1 2 3 4))

OUTPUT:((1 2) (3 4))

回答

4

下面是函數:

(defun pairup (l) 
    (cond ((null l) nil) 
     ((null (cdr l)) (list l)) 
     (t (cons (list (car l) (cadr l)) 
       (pairup (cddr l)))))) 

(pairup '(1 2 3 4)) ; produces ((1 2) (3 4)) 
(pairup '(1 2 3))  ; produces ((1 2) (3)) 

注意,cond的第二分支當只留下一個元素時終止遞歸,並且如果初始列表具有奇數個元素,則這是必需的。 cond的語法要求分支的第一種形式始終是條件,在最後一個分支中條件爲t以捕獲所有其他情況。

+0

啊。我懂了。原始代碼將產生'((1。2)(3))'(配對'(1 2 3))',並且你的代碼產生'((1 2)(3))'(我依靠更多關於答案中的代碼並收回我的評論)。 – Vatine

+0

感謝您的解釋!我終於能夠得到它=) – F0xcr4f7

+0

不客氣! – Renzo