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,      ()] ↦ ()