我不太熟悉功能风格,我不想使用任何设置功能,所以我遇到了问题。无论是递归还是以不同的方式,我都在苦苦挣扎。
我在列表中有一组对,如下所示:
((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))
感谢您的时间和精力。
答案 0 :(得分:3)
对您的列表进行迭代,并将每对car
存储到assoc
中的列表中,如下所示:
original: ((2 . 1) (3 . 2) (1 . 2) (5 . 1) (6 . 3))
new: ((1 . (2 5))
(2 . (3 1))
(3 . (6))
然后将所有cdr
加在一起并翻转每一对以获得此结果:
((7 . 1) (4 . 2) (6 . 3))
答案 1 :(得分: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*))
对于凌乱的代码感到抱歉,但如果我理解问题就应该这样做。