[英]Swapping elements in a Common Lisp list
是否有一個Common Lisp函數,它將在給定索引的列表中交換兩個元素並返回修改后的列表?
你可以使用rotatef
:
(rotatef (nth i lst) (nth j lst))
當然,列表索引可能很昂貴(花費O( 列表大小 )),所以如果你這樣做有規律性,你寧願使用數組:
(rotatef (aref arr i) (aref arr j))
我會避免使用nthcdr
兩次索引到列表中,以獲取包含要交換的第一個元素的cons單元格的cdr,然后使用elt
將剩余元素從子列表中取出。 這意味着您只需要從列表的頭部開始實際索引一次。
(let ((list-tail (nthcdr i list)))
(rotatef (car list-tail)
(elt list-tail (- j i)))
list)
至少從我的角度來看,這對於一個函數來說是足夠繁瑣的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.