Обменять элементы в списке Lisp - PullRequest
2 голосов
/ 18 октября 2011

Я пытаюсь реализовать функцию, которая возвращает список LIST (каждый список в LIST является результатом двух элементов, поменяемых местами в списке). Предполагается, что поиск будет выполняться на основе списка, сформированного из каждого свопа. Это часть моей программы для решения 8 задач. Вот что у меня есть

(setq *LIST* nil) 

(defun swapped_list(lst)
 (loop for j in (positions_to_swap) do
    (setq *LIST* (rotatef (nth pos lst) (nth j lst))
      *LIST*)

(swapped_list '(11 12 13 14 15 16 17 18 19))

Если positions_to_swap равно (0 2 5) и pos равно 4, это должно вернуть ((15 12 13 14 11 16 17 18 19) (11 12 15 14 13 16 17 18 19) (11 12 13 14 16 15 17 18 19))

Я тратил бесчисленные часы, пытаясь отлаживать без прогресса. Я перепробовал много вариантов, но ни один из них не работает.

1 Ответ

1 голос
/ 18 октября 2011

Если position_to_swap равен (0 2 5), а pos равен 4, это должно вернуться ((15 12 13 14 11 16 17 18 19) (11 12 15 14 13 16 17 18 19) (11 12 13 14 16 15 17 18 19))

(defun swap (list position positions-to-swap)
  (loop for position-to-swap in positions-to-swap
        for rotated-list = (copy-list list)
        do (rotatef (nth position rotated-list)
                    (nth position-to-swap rotated-list))
        collect rotated-list))

Делает трюк:

CL-USER> (swap '(11 12 13 14 15 16 17 18 19) 4 '(0 2 5))
((15 12 13 14 11 16 17 18 19)
 (11 12 15 14 13 16 17 18 19)
 (11 12 13 14 16 15 17 18 19))
...