你不可能在你的解決方案中使用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))。
您可能想要考慮一個雙遞歸 – mck
這個問題正在積累一些密切的投票,因爲「詢問代碼的問題必須顯示對所解決問題的最小理解,包括嘗試解決方案,爲什麼他們不工作,以及預期成績。」你試過什麼了?什麼沒有工作呢? –
您可能希望將您的任務分解爲單獨的問題。正如你所說的那樣,你首先需要從'1'和'4'生成'(1 2 3 4)'。這是一個子問題(並不是特別困難)。之後,您需要從'(1 2 3 4)'構建對的列表。你有沒有試圖解決這些問題? –