1

我在 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 的新手,不知道我做错了什么。对此的帮助将不胜感激,因为我已经在这几个小时了。

谢谢。

4

1 回答 1

1

递归算法是:

要将 n 个圆盘从钉 A 移到钉 C:
1. 将 n-1 个圆盘从 A 移到 B。这使圆盘 n 单独在钉 A 上
2. 将圆盘 n 从 A 移到 C
3. 将 n-1 个圆盘从 B 移到C 所以他们坐在光盘 n

(来自http://en.wikipedia.org/wiki/Tower_of_Hanoi#Recursive_solution

由于 A、B 和 C(您的 和 )的含义与from当前aux迭代to相关并不断变化,因此更容易不传递游戏状态并试图理解其含义,而是简单地生成求解指令。

要以这种方式实现上述算法,您需要在您的 1 中进行以下操作(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)4(hanoi 4 1 2 3)个磁盘。

于 2011-10-13T06:31:11.933 回答