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

标签 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/

相关文章:

lisp中的搜索功能

orm - 带有 SQL 后端的 Lisp OODB - 或者好的 ORM

debugging - Common-LISP 调试(包含代码)

lisp - 一次为一个变量分配随机值并在 LISP 中使用该信息

lisp - 检查元素是否是列表的成员

lisp - 对小于 n 的正数求和

string - 列表或向量上相同的头和尾操作

javascript - JavaScript 提供了哪些函数式编程方面的子集和类似 Lisp 的特性?

list - 在 Common Lisp 中获取列表的前 n 个元素?

lisp - 用最后一个元素替换子列表