2013-11-14 54 views
0

這是一項家庭作業,我不允許使用循環或全局變量。遞歸 - 獲取列表中所有可能的對

基本功能看起來像

(defun pairs (1 4) 

,使像這樣(1 2 3 4)列表,並找到所有可能的對,所以它應該返回((1 2) (1 3) (1 4) (2 3) (2 4) (3 4))。我試過的所有代碼都不會給我所有的配對,通常只會導致從開始到結束的配對,如(1 2) (2 3) (3 4)。我也不確定基本情況應該是(= m n)還是(= (1- m) n)

+0

您可能想要考慮一個雙遞歸 – mck

+0

這個問題正在積累一些密切的投票,因爲「詢問代碼的問題必須顯示對所解決問題的最小理解,包括嘗試解決方案,爲什麼他們不工作,以及預期成績。」你試過什麼了?什麼沒有工作呢? –

+0

您可能希望將您的任務分解爲單獨的問題。正如你所說的那樣,你首先需要從'1'和'4'生成'(1 2 3 4)'。這是一個子問題(並不是特別困難)。之後,您需要從'(1 2 3 4)'構建對的列表。你有沒有試圖解決這些問題? –

回答

2

你不可能在你的解決方案中使用mapcon,所以我不覺得下面的代碼給你一個家庭作業的答案。但是,如果您閱讀了mapcon的內容,並瞭解如何實施它,則可以使用以下內容作爲解決方案的指南。

(defun pairs (list) 
    (mapcon (lambda (tail) 
      (mapcar (lambda (y) 
         (list (first tail) y)) 
        (rest tail))) 
      list)) 
CL-USER> (pairs '(1 2 3 4)) 
;=> ((1 2) (1 3) (1 4) (2 3) (2 4) (3 4)) 

這裏的想法是,如果你想在尾巴你原來的列表遞歸。也就是說,考慮(1 2 3 4)並生成一些對,然後再考慮(2 3 4),並從產生一些對,然後(3 4),然後(4)和生成(空集),從一些對:

(1 2 3 4) → [1, (2 3 4)] ↦ ((1 2) (1 3) (1 4)) 
    (2 3 4) → [2, (3 4)] ↦ ((2 3) (2 4)) 
    (3 4) → [3,  (4)] ↦ ((3 4)) 
     (4) → [4,  ()] ↦() 

然後你只需要將((1 2)(1 3)(1 4)),((2 3)(2 4)),((3 4))和()一起得到((1 2) 3)(1 4)(2 3)(2 4)(3 4))。