If you're seeing this message, it means we're having trouble loading external resources on our website.

如果你被网页过滤器挡住,请确保域名*.kastatic.org*.kasandbox.org 没有被阻止.

主要内容

汉诺塔

如果你已经完成递归的学习,那么你就已经准备好学习另一个多次递归真正产生效果的问题。它就是汉诺塔。 你将获得三个杆子和n个圆盘的一组装置,每个圆盘的大小不同。让我们将杆子分别命名为A、B和C,并将圆盘从1(最小的圆盘)开始编号至n(最大的圆盘)。开始时,所有n个圆盘都在杆子A上,从底部到顶部按顺序递减,因此圆盘n位于底部,圆盘1位于顶部。这是有n=5个圆盘时,汉诺塔的样子:
三座塔,标号为A、B和C。塔 A的圆盘号为5、4、3、2和1,圆盘5在底部且圆盘1在顶部。塔B和C没有圆盘。
目标是将所有 n 个圆盘从杆子 A 移动到 B:
三座塔,标号为A、B和C。塔B的圆盘号为5、4、3、2和1,圆盘5在底部且圆盘1在顶部。塔A和C没有圆盘。
听起来很简单,对吧?但实际上并不容易,因为你必须遵守两个规则:
  1. 一次只能移动一个圆盘。
  2. 任何圆盘都不能停留在较小的圆盘上。例如,如果圆盘3处于杆子上,则圆盘3下的所有圆盘的数字都必须大于3。
你可能认为这个问题并不十分重要。 相反! 传说在亚洲的某个地方(西藏、越南、印度 —— 选择你喜欢的互联网上的传奇),僧侣们正在解决包含64个圆盘的移动问题,所以故事发展成这样 —— 僧侣们相信,根据这两条规则,一旦他们完成将所有64个圆盘从杆子A移动到杆子B,世界就要终结。如果僧侣行动正确,我们会面临世界末日吗?
首先,让我们看看如何递归地解决问题。我们将从一个非常简单的案例开始:一个圆盘,即 n=1n=1 是最基本情况。 你总是可以将圆盘 1 从杆子 A 移动到杆子 B,因为你知道下面的任何圆盘都会比 1 更大。 如果你愿意,可以将圆盘 1 从杆子 B 移动到杆子 C,或者从 杆子 C 移动到 杆子 A,或从任何杆子到任何杆子。 用一个圆盘解决汉诺塔问题有明显答案,它只需要移动一个圆盘一次。
两个圆盘怎么样?当 n=2 时,如何解决这个问题?你可以通过三个步骤来完成。下面是它在开始时的样子:
三座塔,标号为A、B和C。塔A的圆盘2在底部且圆盘1在顶部。塔B和C没有圆盘。
首先,将圆盘 1 从杆子 A 移动到杆子 C:
有三座塔,分别为A、B和C。塔A有圆盘2。塔B没有圆盘。塔C有圆盘1。
请注意,我们使用杆子 C 作为备用,放置 圆盘 1 以便我们可以获得 圆盘 2。 现在,圆盘 2 —— 最底层的圆盘 —— 出现,将其移动到杆子 B:
有三座塔,分别为A、B和C。塔A没有圆盘。塔B有有圆盘2。塔C有圆盘1。
最后,将 圆盘1 从 杆子C 移动到 杆子B:
有三座塔,分别为A、B和C。塔A没有圆盘。塔B在底部有圆盘2,顶部有圆盘1。塔C没有圆盘。
这个解决方案需要三个步骤,再次将两个圆盘从 杆A 移动到 杆B 没有什么特别之处。你可以使用 杆A 作为备用杆子将它们从 杆B 移动到 杆C:将圆盘1从 杆B 移动到 杆A,然后将圆盘2从 杆B 移动到 杆C,最后将圆盘1从 杆A 移动到 杆C。你是否同意存在三步内将圆盘1和2从任何杆子移动到任何杆子的方法?(说“是”。)

本内容是 达特茅斯计算机科学 教授 Thomas CormenDevin Balkcom,与可汗学院的计算课程团队合作完成。内容获得许可 CC-BY-NC-SA

想加入讨论吗?

尚无帖子。
你会英语吗?单击此处查看更多可汗学院英文版的讨论.