Lisp 递归-获取列表中所有可能的对
这是一个家庭作业,我不允许使用循环或全局变量 基本上函数看起来像Lisp 递归-获取列表中所有可能的对,lisp,common-lisp,Lisp,Common Lisp,这是一个家庭作业,我不允许使用循环或全局变量 基本上函数看起来像 (defun pairs (1 4) 并创建一个类似于so的列表(1234),并找到所有可能的对,因此它应该返回((12314)(233)(244))。我尝试过的所有代码都没有给出所有的配对,通常只会从开始到结束得到配对,比如(12)(23)(34)。我也不确定基本情况应该是(=mn)还是(=(1-m)n)在解决方案中不太可能使用mapcon,所以我觉得下面的代码并没有给你一个家庭作业的答案。但是,如果您仔细阅读了它的作用,并了
(defun pairs (1 4)
并创建一个类似于so的列表
(1234)
,并找到所有可能的对,因此它应该返回((12314)(233)(244))
。我尝试过的所有代码都没有给出所有的配对,通常只会从开始到结束得到配对,比如(12)(23)(34)
。我也不确定基本情况应该是(=mn)
还是(=(1-m)n)
在解决方案中不太可能使用mapcon
,所以我觉得下面的代码并没有给你一个家庭作业的答案。但是,如果您仔细阅读了它的作用,并了解了如何实现它,那么您可以使用以下内容作为解决方案的指南
(defun pairs (list)
(mapcon (lambda (tail)
(mapcar (lambda (y)
(list (first tail) y))
(rest tail)))
list))
这里的想法是,如果您想在原始列表的尾部递归。也就是说,考虑<代码>(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, ()] ↦ ()
然后你只需要把((12)(13)(14)),((23)(24)),((34))和()放在一起,就可以得到((12)(13)(14)(23)(24)(34))。你可能想考虑一个双重递归这个问题正在积累一些接近票数,因为“询问代码的问题必须表明对正在解决的问题的最低理解。包括尝试过的解决方案,为什么它们不起作用,以及预期的结果。“到目前为止,您尝试过什么?什么不起作用?您可能希望将任务分成不同的问题。在您的措辞中,您首先需要从
1
和4
生成(1 2 3 4)
。这是一个子问题(这不是一个特别难的问题)。然后,您需要从(1 2 3 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, ()] ↦ ()