2013-11-14 27 views
0

这是一项家庭作业,我不允许使用循环或全局变量。递归 - 获取列表中所有可能的对

基本功能看起来像

(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

您可能想要考虑一个双递归 – mck

+0

这个问题正在积累一些密切的投票,因为“询问代码的问题必须显示对所解决问题的最小理解,包括尝试解决方案,为什么他们不工作,以及预期成绩。”你试过什么了?什么没有工作呢? –

+0

您可能希望将您的任务分解为单独的问题。正如你所说的那样,你首先需要从'1'和'4'生成'(1 2 3 4)'。这是一个子问题(并不是特别困难)。之后,您需要从'(1 2 3 4)'构建对的列表。你有没有试图解决这些问题? –

回答

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)) 

这里的想法是,如果你想在尾巴你原来的列表递归。也就是说,考虑(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) 3)(1 4)(2 3)(2 4)(3 4))。