あなたが最初と最後の要素を交換したいと仮定すると、ここでそれを行う実装です。これはリストを3回トラバースして2回コピーします。これよりもはるかにうまくいく可能性がありますが、合理的に悪意を持っているわけではありません(特にrotatef
の素朴な実装は、一度rotatef
は破壊的であるので、あなたは、リストの最初のコピーを必要とするよう):
(defun swapify (list)
;; swap the first and last elements of list
(if (null (rest list))
list
(cons (first (last list)) ; 1st traversal
(append (butlast (rest list)) ; 2nd and third traversals
(list (first list))))))
そして、ここでは正確に一度リストを横断よこしまな実装です。これは、テールコールの削除に依存します。より簡単なループを使用するバージョンはかなり明白です。
(defun swapify (list)
;; return a copy of list with the first and last elements swapped
(if (null (rest list))
list
(let ((copy (cons nil nil)))
(labels ((walk (current tail)
(if (null (rest tail))
(progn
(setf (first copy) (first tail)
(rest current) (cons (first list) nil))
copy)
(progn
(setf (rest current) (cons (first tail) nil))
(walk (rest current) (rest tail))))))
(walk copy (rest list))))))
出典
2017-03-06 18:02:04
tfb
コードを適切に書式設定して、機能が想定していることを説明してください。 – sds