在公共Lisp中交换列表元素
我需要交换给定两个位置(I,j)的列表元素,以实现TSP的2-opt启发式,并建议使用在公共Lisp中交换列表元素,lisp,common-lisp,Lisp,Common Lisp,我需要交换给定两个位置(I,j)的列表元素,以实现TSP的2-opt启发式,并建议使用rotatef 然而,当我尝试使用它时,我无法理解它的行为 这段代码让我头疼: (setq loop '(A B C D E F)) > (A B C D E F) ;; Original copy saved in loop (setq new_tour loop) (format t "ORIGINAL LOOP: " loop) > LOOP: (A B C D E F) (format
rotatef
然而,当我尝试使用它时,我无法理解它的行为
这段代码让我头疼:
(setq loop '(A B C D E F))
> (A B C D E F)
;; Original copy saved in loop
(setq new_tour loop)
(format t "ORIGINAL LOOP: " loop)
> LOOP: (A B C D E F)
(format t "NEW_TOUR: " new_tour)
> NEW_TOUR: (A B C D E F)
(rotatef (nth 0 new_tour) (nth 1 new_tour))
(format t "NEW_TOUR IS NOW: ~a~%" new_tour)
> NEW_TOUR IS NOW: (B A C D E F)
(format t "ORIGINAL LOOP IS NOW: ~a~%" loop)
> ORIGINAL LOOP IS NOW: (B A C D E F)
为什么
rotatef
也会修改“循环”列表?有没有一种方法可以在不丢失原始列表(loop
)的情况下交换new\u-tour
的元素?复制loop
使用
(setq new_tour (copy-list loop))
要复制
循环
请使用
(setq new_tour (copy-list loop))
你没有复印。您的代码中只有一个列表。您有两个变量指向同一个文本列表。由于您的问题与AI或启发式无关,我已删除这些标记…您没有复制。您的代码中只有一个列表。您有两个变量指向同一个文本列表。由于您的问题与AI或启发式无关,我已删除这些标记。。。