递归 - 获取列表中的所有可能对

时间:2013-11-14 17:32:06

标签: 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)

1 个答案:

答案 0 :(得分:2)

您不太可能在解决方案中使用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))

这里的想法是,如果您想要递归原始列表的 tails 。也就是说,考虑(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))。