2016-03-09 66 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