我正在尝试实现一个返回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))
我花了无数个小时试图调试没有进展。我尝试了很多变种,但都没有。
答案 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))