在Lisp解决河内的递归塔

时间:2011-10-12 23:17:33

标签: recursion clisp towers-of-hanoi

我在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的新手,并且不知道我做错了什么。 由于我已经在这里待了好几个小时,所以对此的帮助将非常受欢迎。

感谢。

1 个答案:

答案 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(您的fromauxto)的含义与当前迭代相关并且不断变化,因此更容易不通过游戏周围并试图理解它的意义,但只是生成解决指令。

要以这种方式实现上述算法,您需要在(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个磁盘。