有没有一个Common Lisp函数,可以根据给定的索引交换列表中的两个元素,并返回修改后的列表?
有没有一个Common Lisp函数,可以根据给定的索引交换列表中的两个元素,并返回修改后的列表?
rotatef
:(rotatef (nth i lst) (nth j lst))
当然,列表索引可能很昂贵(成本为O(列表大小)),因此如果您经常这样做,最好使用数组:
当然,对列表进行索引可能会很耗费资源(时间复杂度为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)
从我的角度来看,这足以证明需要一个函数来简化操作。