1

機能的なスタイルがあまり得意ではなく、集合関数を使いたくないので問題があります。再帰的に行うべきか、別の方法で行うべきか、私は本当に苦労しています。

次のように、リストにペアのコレクションがあります。

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

このペア'(4 2)では、2番目の要素' 2'は、それが一致する他のペア(この場合は'(3 2))を教えてくれます。したがって、最初の要素(この場合は「4」と「3」)を使用して、これら2つのペアを足し合わせます。新しいペアは'(7 2)になりました。リスト内の他のペアについても同様です。最後に、次のように返されます。

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

私は注文をあまり気にしません。。私はすでに2つの異なるペアを追加する動作機能を持っています。この関数の唯一の仮定は、ペアが一致していることです。

したがって、私がやりたいのは、このペアのリストを操作して、これらの方法でリストを返すことです。

例:

 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 に答える