我在lisp中的代码如下:
(defun solve-hanoi(from) (hanoi (length from) from '() '()))
(defun hanoi(height from to aux) (when (>= height 1)
(hanoi (- height 1) from aux to)
(format t "~%Move ~a from ~a to ~a" (nth 0 from) from to)
(push (pop from) to)
(hanoi (- height 1) aux to from)))
我是lisp的新手,并且不知道我做错了什么。 由于我已经在这里待了好几个小时,所以对此的帮助将非常受欢迎。
感谢。
答案 0 :(得分:1)
递归算法是:
将n个圆盘从挂钉A移动到挂钉C:
1.将n-1个光盘从A移动到B.这样就可以将光盘n单独留在弦轴A上 2.将光盘n从A移动到C
3.将n-1个光盘从B移到C,使它们位于光盘上
(来自http://en.wikipedia.org/wiki/Tower_of_Hanoi#Recursive_solution)
由于A,B和C(您的from
,aux
和to
)的含义与当前迭代相关并且不断变化,因此更容易不通过游戏周围并试图理解它的意义,但只是生成解决指令。
要以这种方式实现上述算法,您需要在(when (>= height 1)
内添加以下内容:
1.用n-1递归呼叫,交换B和C.你已经得到了这个
2.打印有关移动的信息,例如(format t "~%Move ~a to ~a" from to)
3.用n-1递归调用,交换A和B.你也得到了这个。
然后更改你的(solve-hanoi)
,以便它将第一根杆上的磁盘数量作为参数,并使用此数字和你想要的任何名称调用(hanoi),例如(hanoi 4 'A 'B 'C)
或(hanoi 4 1 2 3)
4个磁盘。