<分区>
这是作业,我不允许使用循环或全局变量。
基本上这个函数看起来像
(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)
。
标签 lisp common-lisp
<分区>
这是作业,我不允许使用循环或全局变量。
基本上这个函数看起来像
(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)
。
最佳答案
您不太可能在您的解决方案中使用 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) (1 3) (1 4) (2 3) (2 4) (3 4)).
关于lisp - 递归 - 获取列表中所有可能的对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19984416/