这是一个家庭作业,我不允许使用循环或全局变量。
基本上该功能看起来像
(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)
。
答案 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))。