你不可能在你的解决方案中使用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)'构建对的列表。你有没有试图解决这些问题? –