機能。 2つのリストを作成して連結します。
(defun my-rotate (length shift)
"Return a list of given LENGTH, rotated by SHIFT."
(nconc
(loop for i from (1+ shift) to (- length shift -2) collect i)
(loop for i from 1 to shift collect i)))
(my-rotate 7 2)
==> (3 4 5 6 7 1 2)
両方loop
sがfreshリストを生成するので、私が代わりにappend
のnconc
を使用することに注意してください。元のリスト内のnthcdr
ポイントは、私たちは変更を避けるためにappend
を使用する必要があること
が
(defun rotate-list (list shift)
"Rotate the given LIST by the specified SHIFT."
(let ((len (length list)))
(setq shift (mod shift len)) ; handle circular shifts
(append (nthcdr (- len shift) list)
(butlast list shift))))
(rotate-list '(1 2 3 4 5 6) 2)
==> (5 6 1 2 3 4)
(rotate-list '(1 2 3 4 5 6) 20)
==> (5 6 1 2 3 4) ; same because 20 = 2 mod 6
(rotate-list '(1 2 3 4 5 6) 0)
==> (1 2 3 4 5 6) ; unchanged
注:ただし、既存のリストを回転させたい場合は
、あなたが何かを行う必要があります引数。我々は(butlast
に一度nthcdr
で、一度)二回list
引数をスキャンすることも
注意。 リストが巨大でプロファイリングでこの機能がボトルネックであることがわかっている場合は、ループを使用してこの機能を書き直したいと思うかもしれません(このシナリオはあまりありません。
出典
2017-02-19 23:44:49
sds
これはどういう意味ですか?あなたの全体的な目標を達成するためのより良い方法があるかもしれません。 – blambert