1

我对函数式风格不太精通,也不想使用任何集合函数,所以我遇到了问题。我真的很挣扎我应该递归还是以不同的方式做。

我在列表中有一组对,如下所示:

((4 2) (3 1) (3 2) (2 4) etc...)

在这对“(4 2)”中,第二个元素“2”告诉我它与哪些其他对匹配,在本例中为“(3 2)。所以,我使用它们的第一个元素将这两对加在一起,在这种情况下,它是“4”和“3”。新的对现在是 '(7 2)。对于列表中的其他对,依此类推。最后,它应该返回:

 ((7 2) (3 1) (2 4))

我不太关心订单。. 我已经有一个添加两个不同对的工作函数。这个函数的唯一假设是这些对是匹配的。

因此,我想要做的是操纵这个对列表以这些方式返回一个列表。

例子:

 take the list ((4 2) (3 1) (3 2) (2 4))    
 matching-pairs: '(4 2) and '(3 2)

 and then return --> ((7 2) (3 1) (2 4))


 take the list ((2 1) (3 2) (1 2) (5 1) (6 3))
 matching-pairs: '(2 1) and '(5 1)
                 '(3 2) and '(1 2)

 and then return --> ((7 1) (4 2) (6 3))

感谢您的时间和努力。

4

2 回答 2

3

遍历您的列表并将每对存储car到一个列表中assoc,如下所示:

original: ((2 . 1) (3 . 2) (1 . 2) (5 . 1) (6 . 3))
new:      ((1 . (2 5))
           (2 . (3 1))
           (3 . (6))

然后将所有 s 相加cdr并翻转每一对得到:

          ((7 . 1) (4 . 2) (6 . 3))
于 2013-01-03T03:04:23.697 回答
1
(defun get-pairs (alist index)
  (cond
   (alist
    (if (= (nth 1 (car alist)) index)
       (append (list (caar alist)) (get-pairs (cdr alist) index))
       (get-pairs (cdr alist) index)))
  ((not alist)
   'nil)))


(defun get-iterator (alist)
  (labels
    ((f (alist res)
        (cond
          (alist
            (if (member (nth 1 (car alist)) res)
              (f (cdr alist) res)
              (f (cdr alist) (append (cdar alist) res))))
          ((not alist)
            res))))
    (f alist 'nil)))


(defun get-value (alist)
  (loop for i in (get-iterator alist)
        collect (get-pairs alist i)))

(defun list-sum (alist)
  (loop for i in (get-value alist)
        collect (apply #'+ i)))

(defun match-value (alist)
  (loop for i in (get-iterator alist)
        for j in (list-sum alist)
        collect (append (list j) (list i))))


(defparameter *my-list* '((2 1) (3 1) (4 2) (5 2) (8 1) (9 2) (1 3) (0 3)))

(print (match-value *my-list*))

很抱歉代码混乱,但如果我正确理解问题,那应该可以解决问题。

于 2013-01-03T03:41:13.677 回答