기능 :
(3 4 5 1 2)
이것은 내가 지금까지 가지고있는 것입니다. 두 개의 목록을 만든 다음 연결합니다. 모두 loop
들 fresh 목록을 생성하기 때문에, 내가 대신 append
의 nconc
를 사용하는 것이
는
(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)
참고. 원래 목록 내부 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