0

宿題の一部としてペアのリストを作成しようとしています。

(関数の途中で)やってみました

(setq list1 (append list1 (cons n1 n2)))

そして、何らかの理由で私は理解していません、これは最初のペアでうまく機能しますが、2番目のペアを追加しようとすると、このエラーがポップアップします:

***-追加:適切なリストは2で終わらせてはなりません

どうすればこれを解決できますか?

それで、この主題を続けて、与えられた答えのおかげで、私は私の問題を修正することができました。でも新しいものが出てきて、それと関係があると思います。だから、私はこの機能を持っています:

(defun action(state)
(let ((list_actions '())
      (limNumActions (1- (list-length state)))
      (limNumSubActions 0)
      (numActions 0)
      (numSubActions 0))
  (loop for numActions from 0 to limNumActions do
    (setq limNumSubActions (1- (list-length (nth numActions state))))
    (loop for numSubActions from 0 to limNumSubActions do
      (setq list_actions (append list_actions
        (list (cons numActions numSubActions))))
      (print 'list_actions)
      (print list_actions)))))

printこの関数を単純な「デバッガー」として使用しました。これを返します:

 LIST_ACTIONS 
 ((0 . 0)) 
 LIST_ACTIONS 
 ((0 . 0) (0 . 1)) 
 LIST_ACTIONS 
 ((0 . 0) (0 . 1) (1 . 0)) 
 LIST_ACTIONS 
 ((0 . 0) (0 . 1) (1 . 0) (1 . 1)) 
 NIL

そして、これはまさに私が期待していた結果です!一部を除いてNIL…なぜリストlist_actionsNIL最後にあるのか理解できますか?

4

3 に答える 3

1

appendリストと単一の要素ではなく、2つのリストを取ります。で使用する前に、ペアの周りにリストを配置する必要がありますappend

現在、ペアはリストの一部として使用されています。これにより、リストが不適切になり、不適切なリストには追加する終了が正確にないため、2番目の追加が失敗します。

于 2012-11-27T23:08:03.257 に答える
1

コードは次のように簡潔に表現できます。

(defun action (state)
  (let ((list-actions '()))
    (loop for i from 0 for state-i in state do
      (loop for j from 0 below (length state-i) do
        (setf list-actions (append list-actions (list (cons i j))))
        (print 'list-actions)
        (print list-actions)))
    list-actions))

append結果だけが必要な場合は、短くすることができます(高価な関数を使用しないため、コストが低くなります)。

(defun action (state)
  (loop for i from 0 for state-i in state append
    (loop for j below (length state-i) collect (cons i j))))
于 2012-11-28T03:59:47.543 に答える
0

私はあなたの例を少し洗練しようとしました+別のバージョンを使用するバージョンを書きますが、IMOは問題に対してより慣用的なアプローチです:

;; Your original version, but cleaned up a bit
(defun action (state)
  (loop with list-actions = nil
     with lim-num-actions = (1- (list-length state))
     with lim-num-sub-actions = 0
     for num-actions from 0 to lim-num-actions
     do (setq lim-num-sub-actions (1- (list-length (nth num-actions state))))
       (loop for num-sub-actions from 0 to lim-num-sub-actions
          do (push (cons num-actions num-sub-actions) list-actions)
            (format t "~&~s ~s" 'list-actions list-actions))
     finally (return list-actions)))

;; A more traditional approach (if you want to use iteration)
(defun action (state)
  (reverse 
   (loop for i in state
      for j from 0
      collect (cons j 0))))

;; Using a nice library to do iteration
(ql:quickload "iterate")
;; Note, you could do (in-package :iterate)
;; to lose `iterate:' prefix to make it even shorter
(defun action (state)
  (iterate:iter
    (iterate:for i #:on state)
    (iterate:for j #:from 0)
    (iterate:accumulate (cons j 0) #:by #'cons)))

;; Just another way to do this, using `reduce'
(reduce #'(lambda (a b)
            (declare (ignore b))
            (cons (cons (1+ (caar a)) 0) a))
        (cdr (mapcar #'list '(1 2 3 4 5)))
        :initial-value '((0 . 0)))

(action (mapcar #'list '(1 2 3 4 5)))
于 2012-11-28T01:15:13.000 に答える