在Lisp列表中交换元素

时间:2011-10-18 03:30:39

标签: list lisp swap

我正在尝试实现一个返回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)pos4,则应返回 ((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 个答案:

答案 0 :(得分:1)

  

如果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))

(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))