17

重複の可能性:
リストの最後にアイテムを追加するための「短所」とは何ですか?

lispに関する多くのチュートリアルを見て、グーグルで答えを探して高低を検索した後でも、LISPのリストの最後に追加する方法がわかりません。

'aリストの最後に関数を追加したいのです'(b c d)が、前に追加する方法しかわかりません。誰かが私が短所を正しく使用し'aてリストの最後に追加するのを手伝ってもらえますか?これが私のコードです。前もって感謝します。

(defun AddRt (a list)
  (cond
    ((null list)
      0)
    (t
      (princ (cons a (cons (car list) (cdr list))))
    )))


(AddRt 'a '(b c d))
4

3 に答える 3

19

pushするかlast、または使用しますnconc

> (defparameter a (list 1 2 3))
A
> (push 4 (cdr (last a)))
(4)
> a
(1 2 3 4)
> (nconc a (list 5))
(1 2 3 4 5)
> a
(1 2 3 4 5)

これらは破壊的な 演算子であることに注意してください。つまり、 のバインディングだけでなく、 のであるオブジェクトを変更します。aa

これが、ところで、引用符で囲まれたリストで使用しないでください.nconc(nconc '(1 2 3) '(4 5 6))

PS。リストの最後に追加するには、完全な トラバーサルが必要であり、したがって操作であることに注意してくださいO(length(list))。リストが長い場合、これは悪い考えかもしれません。そのため、人々はしばしば push/nreverse イディオムを使用します。

(let (range)
  (dotimes (i 10 (nreverse range))
    (push i range)))
==> (0 1 2 3 4 5 6 7 8 9)
于 2012-11-13T22:25:21.587 に答える
7

再帰関数を使用できます。また、princ を内部で使用することは避けてください。

次の関数endconsはconsとまったく同じことを行いますが、値が最後に追加されます。

(defun endcons (a v)
   (if (null v) (cons a nil) (cons (car v) (endcons a (cdr v)))))

(endcons 'a '(b c d))

もちろん、appendを使用することもできます:

(append '(b c d) '(a))

この関連する質問も参照してください:リストの最後に項目を追加する「短所」は何ですか?

于 2012-11-13T11:56:27.377 に答える
4

1 つの方法は、リストを逆にすることです。反転リストの先頭に要素を追加します。そして最後にリスト全体を逆にします。

スキームコード:

(define (add-to-tail l x)
   (reverse (cons x (reverse l)))

ただし、これが頻繁に必要な操作である場合は、(単一リンク) リスト以外のデータ構造を見つけることをお勧めします。

于 2012-11-13T20:10:17.903 に答える