Existe-t-il une fonction Common Lisp permettant d'échanger deux éléments dans une liste en fonction de leurs indices et de renvoyer la liste modifiée?Permutation d'éléments dans une liste Common Lisp
11
A
Répondre
16
Vous pouvez utiliser rotatef
:
(rotatef (nth i lst) (nth j lst))
Bien sûr, l'indexation de la liste peut être coûteux (le coût O (taille de la liste)), donc si vous faites cela avec une certaine régularité, vous souhaitez plutôt d'utiliser un tableau:
(rotatef (aref arr i) (aref arr j))
4
Je voudrais éviter l'indexation dans la liste deux fois en utilisant nthcdr
pour obtenir le cdr de la cellule de contre contenant le premier élément que vous souhaitez échanger et utiliser elt
à g et l'élément restant de la sous-liste. Cela signifie que vous devez seulement indexer en commençant à partir de la tête de la liste une fois.
(let ((list-tail (nthcdr i list)))
(rotatef (car list-tail)
(elt list-tail (- j i)))
list)
Au moins de mon point de vue, cela est suffisamment fastidieux pour justifier une fonction.
DAMN! Le SO doit faire quelque chose au sujet de la coloration syntaxique. Je pensais que c'était mauvais pour python. – aaronasterling