2016-10-02 57 views
1

我正在嘗試使用遞歸使一個參數成對。 但我不知道如何解決這個問題。 這是我的代碼。如何在lisp中創建一對列表

(defun makepair (l) 
    (cond ((null l) nil) 
     ((and (atom (car l)) (atom (cdr l))) (list (car l) (cdr l))) 
     (t (makepair (cdr l))) 
) 
) 

我必須做出'(1 d 2 c)((1 d) (1 2) (1 c) (d 2) (d c) (2 c))

+0

有什麼不對您的碼? –

+0

它不工作:( –

+0

'mapcon':對於每個列表,請考慮它的汽車和cdr。將cdr的每個元素映射到一對車。 – coredump

回答

0

試試這個:

(defun makepair (l) 
     (if (atom l) nil 
     (append (loop for i in (rest l) 
        collecting (list (car l) i)) 
      (makepair (rest l))))) 
0

遞歸版本(根據需要)應該是這樣的:

(defun make-pair (l) 
    (when (and l (cdr l)) 
     (append (mapcar #'(lambda (x) (list (car l) x)) (cdr l)) 
      (make-pair (cdr l))))) 

(make-pair '(1 d 2 c)) => ((1 D) (1 2) (1 C) (D 2) (D C) (2 C))