第7章汉诺Hanoi塔问题
- 格式:ppt
- 大小:595.00 KB
- 文档页数:41
/*拿到这个题目首先想到的是经典的“汉诺塔问题”,
但是那是汉诺“单塔”,而这道题目是汉诺“双塔”,于是可以用
贪心策略,把两块相同大小的圆盘看成一个圆盘,于是问题就简化成“单塔”了,
而hanoi塔简单的做法就是递归,递归方程为f(n)=2*f(n-1)+1,道理很简单,当前
n个圆盘总的移动次数可以看成y由n-1个圆盘移动基础上得来的,而具体关系就是
f(n)=f(n-1)+f(n-1)+1,例如,n个盘都在A塔上,先把A上面的n-1个盘移到B盘上,用了
f(n-1)次,再把A盘上最底下的盘放到C盘上,用1次,最后,再把B盘上的盘都移到C盘
上,用f(n-1)次,总共为2*f(n-1)+1次。
而为了简化程序,可以把递归改为迭代,用一个循环加数组存储搞定,省时省空间*/
#include<stdio.h>
int main()
{int f[100],i,n;
scanf("%d",&n);
f[1]=1;
for(i=2;i<=n;i++)f[i]=2*f[i-1]+1; //递归公式f[n]=f[n-1]*2+1;
printf("%d",f[n]*2); //在单塔的基础上乘2
return 0;
}。
汉诺塔问题数学解法汉诺塔问题是一个经典的数学难题,也是计算机科学中的常见算法题目。
在这个问题中,我们需要将三个塔座上的圆盘按照一定规则从一座塔移动到另一座塔,只能每次移动一个圆盘,并且在移动过程中始终保持大圆盘在小圆盘下面。
为了解决汉诺塔问题,我们首先需要了解递归的概念。
递归是一种问题解决方法,其中问题被分解为更小的子问题,直到最小的问题可以直接解决。
在汉诺塔问题中,我们可以使用递归来实现移动圆盘的步骤。
设有三个塔座,分别为A、B、C,并且初始时所有的圆盘都在A 塔上,我们的目标是将所有的圆盘移动到C塔上。
为了方便讨论,我们将最小的圆盘称为第1号圆盘,次小的圆盘称为第2号圆盘,以此类推,最大的圆盘称为第n号圆盘。
解决汉诺塔问题的数学解法如下:1. 当只有一个圆盘时,直接将它从A塔移动到C塔,移动结束。
2. 当有两个或以上的圆盘时,可以按照以下步骤进行移动:(1) 先将上面n-1个圆盘从A塔移动到B塔(借助C塔)。
(2) 将第n号圆盘从A塔移动到C塔。
(3) 最后将n-1个圆盘从B塔移动到C塔(借助A塔)。
通过以上步骤,我们可以将n个圆盘从A塔移动到C塔,完成整个汉诺塔问题的解。
这个数学解法的正确性可以通过递归的思想来解释。
当有n个圆盘时,我们需要借助第三个塔座将前n-1个圆盘移动到B塔上,然后将第n号圆盘移动到C塔上,最后再将n-1个圆盘从B塔移动到C塔上。
这个过程可以看作是一个递归过程,我们首先需要将前n-1个圆盘从A 塔移动到B塔上,然后再将第n号圆盘从A塔移动到C塔上,最后再将n-1个圆盘从B塔移动到C塔上。
通过不断缩小问题规模,我们最终可以将整个汉诺塔问题解决。
总结起来,汉诺塔问题是一个经典的数学难题,解决这个问题可以使用递归的数学解法。
通过将问题分解为更小的子问题,我们可以将n 个圆盘从一座塔移动到另一座塔上。
这个数学解法的正确性可以通过递归的思想来解释。
希望通过以上的介绍,您对汉诺塔问题的数学解法有了更深入的理解。
汉诺塔问题非递归算法汉诺塔(Hanoi)问题,又称为汉诺塔游戏,是一种数学问题,源自印度传说。
它主要涉及把一堆圆盘,从一个柱子上移动到另一个柱子上的规则和方法。
在这篇文章中,我们将介绍汉诺塔问题的非递归算法,即利用迭代实现移动圆盘的操作。
汉诺塔问题的规则很简单:给定三个柱子,分别标记为源柱子(A)、辅助柱子(B)和目标柱子(C)。
开始时,所有的圆盘都放置在源柱子上,按从大到小的顺序堆叠。
目标是将所有圆盘从源柱子上移到目标柱子上,期间可以借助辅助柱子。
但是,有以下限制条件:1. 每次只能移动一个圆盘;2. 大圆盘不能放在小圆盘上面。
接下来,我们将详细介绍如何使用非递归算法来解决汉诺塔问题。
首先,我们可以观察到移动圆盘的规律:1. 如果只有一个圆盘,直接将其从源柱子移动到目标柱子上即可;2. 如果有两个圆盘,先将较小的圆盘从源柱子移动到辅助柱子上,再将较大的圆盘从源柱子移动到目标柱子上,最后将较小的圆盘从辅助柱子移动到目标柱子上。
根据以上规律,我们可以推导出非递归算法的步骤:步骤一:定义一个栈,用于存储每一步的操作。
首先将开始状态(源柱子、辅助柱子、目标柱子)入栈。
步骤二:当栈不为空时,执行以下操作:1. 弹出栈顶元素,即当前状态;2. 如果只有一个圆盘需要移动,直接移动该圆盘到目标柱子,并将该状态出栈;3. 如果有多个圆盘需要移动,根据汉诺塔的规则,推导出下一个状态(包括源、辅助和目标柱子的变化),并将该状态入栈。
步骤三:重复步骤二,直到栈为空。
通过以上步骤,我们可以实现汉诺塔问题的非递归算法。
以下是一个示例代码:```pythondef hanoi(n, source, auxiliary, target):stack = []stack.append((n, source, auxiliary, target)) # 步骤一while stack:disks, source, auxiliary, target = stack.pop() # 步骤二 - 弹出当前状态if disks == 1: # 只有一个圆盘需要移动print(f"Move disk 1 from {source} to {target}")else:stack.append((disks-1, auxiliary, source, target)) # 推导下一个状态并入栈stack.append((1, source, auxiliary, target)) # 推导下一个状态并入栈stack.append((disks-1, source, target, auxiliary)) # 推导下一个状态并入栈# 在此处输入汉诺塔的初始状态和圆盘数量n = int(input("请输入圆盘的数量:"))hanoi(n, 'A', 'B', 'C')```以上示例中,我们使用了一个栈来模拟递归的过程,并根据汉诺塔问题的规律,不断推导下一个状态,并将其入栈。
汉诺塔问题算法汉诺塔问题是一个经典的数学问题和递归算法问题。
在汉诺塔问题中,有三个柱子,分别称为A、B、C,有一组大小不同的圆盘,开始时,这些圆盘都堆叠在A柱子上,目标是将所有的圆盘从A柱子移动到C柱子上,期间可以借助B柱子。
以下是汉诺塔问题的算法实现:1.如果只有一个圆盘,直接将其移动到C柱子上。
2.如果有多个圆盘(n个),先将上面的n1个圆盘从A柱子移动到B柱子上。
a.将上面的n1个圆盘从A柱子移动到C柱子,此时B柱子作为辅助柱子。
b.将最下面的第n个圆盘从A柱子移动到C柱子。
3.最后将B柱子作为起始柱子,A柱子作为辅助柱子,将B 柱子上的n1个圆盘移动到C柱子上。
实现递归函数hanoi(n,start,aux,end):如果n=1,直接将start柱子上的圆盘移动到end柱子上。
否则,将上面的n1个圆盘从start柱子移动到aux柱子。
调用递归函数hanoi(n1,start,end,aux),将start柱子上的n1个圆盘移动到aux柱子上。
将第n个圆盘从start柱子移动到end柱子上。
调用递归函数hanoi(n1,aux,start,end),将aux柱子上的n1个圆盘移动到end柱子上。
调用递归函数hanoi(n,'A','B','C')可以解决汉诺塔问题,其中n表示圆盘的数量,'A'、'B'、'C'表示三个柱子。
以上是汉诺塔问题的基本算法。
通过递归调用,可以有效地解决汉诺塔问题,但是当圆盘数量较大时,计算量会变得非常大。
因此,在实际应用中需要考虑到算法的优化和效率问题。
Hanoi塔问题递归与非递归的...Hanoi塔问题的递归与非递归算法等价性证明[1]递归算法:Hanoi塔问题递归算法的简单描述如下:假设要解决的汉诺塔共有n个圆盘,对a塔上的全部n个圆盘从小到大顺序编号,最小的圆盘为1号,次之为2号,依次类推,则最下面的圆盘的编号为N。
第一步:若a塔上只有一个圆盘,即汉诺塔只有一层,则只需将这个盘从a塔上移到b塔上即可;第二步:对于一个有n(n>1)个圆盘的汉诺塔,将n个圆盘分成两部分:上面的n-1个圆盘和最下面的n号圆盘。
解决n个圆盘的汉诺塔,可以按下面的方式进行操作:1、将a塔上面的n-1个圆盘,借助b塔,移到c塔上;2、将a塔上剩余的n号盘子移到b塔上;3、将c塔上的n-1个盘子,借助a塔,移到b塔上。
void hannoi(int n,int a,int b,int c){if(n>0){hannoi(n-1,a,c,b);move(x,n,z) ;hannio(n-1,c,b,a);}}[2]非递归算法:名词解释第一类环:最小的那个圆环,就是在移动之前处在唯一有圆环的杆上最高位置的那个圆环。
第一类移动:第一类环的移动,就是第一类移动。
有用性结论1、在实现汉诺塔移动的过程中,第一类移动和非第一类移动交替出现。
2、第一类移动在一次移动中,要移动到的位置不会是上一次第一类移动移动之前圆环的位置。
换句话说,在只有三个杆的情况下,第一类移动是循环进行的。
算法思路1、n个圆盘的汉诺塔实现过程正好是2n步(用数学归纳法极易证明)。
2、由于第一步肯定是第一类移动,所以循环执行第奇数次时,都是第一类移动。
若将三个杆分别编为a、b、c,则第一类移动是从a杆移动到c杆,则当n为奇数时,第一类移动的次序为a到c到b 再回到a的循环。
当n为偶数时,第一类移动的次序为a到b到c再回到a的循环。
3、循环执行第偶数次时,都是非第一类移动。
比较三个杆的顶端的圆环,将两个顶端较大的圆环中较小的小圆环移动到顶端圆环最大的杆上即可。
Hanoi塔问题学号:姓名:1、问题及来源Hanoi塔又称汉诺塔、梵塔在十九世纪末,欧洲风行的一种游戏。
并大肆宣传说,布拉玛神庙的教士所玩的这种游戏结束之日就是世界毁灭之时。
该塔由三根固定金刚石插针和堆放在一根针上有小到大的64个金属盘片组成,目的是借助于中间,从左边移到右边。
规则是:一次移动一个盘;无论何时,小盘在上,大盘在下。
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。
大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。
大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。
并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
2、问题解决过程一、下面分析三层盘子的情况。
A BC A BCA 柱上的1,2两个,先搬到B 柱上(递归完成)再把A 柱上的3号搬到C 柱上最后把B 柱上的1,2两个搬到C 柱上(递归完成)。
二、 将三根针分别标记为A,B,C 针,要从含有n 个盘子的A 针上借助于B 针移动n个盘子到C 针,分为以下步骤:○1将A 针上的n-1个盘子借助于C 针移动到B 针;A BCA B CA BCA BC○2A针上剩下的最后一个最大的盘子直接移动到Ch;○3将B针上的n-1个盘子借助于A针移动到C针上;在上述步骤中,第1,3步骤使用到了递归的思想。
三、C++实现代码#include<iostream>using namespace std;#include<stdlib.h>void move(char ,char );void hanoi(int n, char a, char b, char c){if (n==1){move ( a , b);}else{hanoi( n-1 , a , b , c );move ( a, c );hanoi( n-1 , b , a , c );}}void move (char x, char y){cout<<x<<"--->"<<y<<endl;}void main(){hanoi(4, 'A', 'B', 'C');}四、输出结果(4层移动方法)1、分析与想法通过分析,最少的移动次数是2n-1,n为盘子的数目,最开始的提出问题的人所给的n值为64,即最少的移动次数是263次方,这是一个天文数字,不借助于高速计算机,人类是无法完成的。
汉诺塔问题
汉诺塔问题是使用递归解决问题的经典范例。
汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图)。
有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。
在移动过程中可以利用B座,要求打印移动的步骤。
如果只有一个盘子,则不需要利用B座,直接将盘子从A移动到C。
•如果有2个盘子,可以先将盘子1上的盘子2移动到B;将盘子1移动到c;将盘子2移动到c。
这说明了:可以借助B将2个盘子从A移动到C,当然,也可以借助C将2个盘子从A移动到B。
•如果有3个盘子,那么根据2个盘子的结论,可以借助c将盘子1上的两个盘子从A移动到B;将盘子1从A移动到C,A变成空座;借助A座,将B上的两个盘子移动到C。
这说明:可以借助一个空座,将3个盘子从一个座移动到另一个。
•如果有4个盘子,那么首先借助空座C,将盘子1上的三个盘子从A移动到B;将盘子1移动到C,A变成空座;借助空座A,将B座上的三个盘子移动到C。
代码如下:。
汉诺塔百科名片汉诺塔初始状态汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。
上帝创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上安大小顺序摞着64片黄金圆盘。
上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。
并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
目录由来汉诺塔与宇宙寿命concreteHAM:汉诺塔问题的程序实现由来汉诺塔与宇宙寿命concreteHAM:汉诺塔问题的程序实现展开编辑本段由来来源汉诺塔是源自印度神话里的玩具。
上帝创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘。
上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。
并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
传说在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。
印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。
不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。
僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。
不管这个传说的可信度有多大,如果考虑一下把64片金片,由一根针上移到另一根针上,并且始终保持上小下大的顺序。
这需要多少次移动呢?这里需要递归的方法。
假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。
此后不难证明f(n)=2^n-1。
n=64时,f(64)= 2^64-1=18446744073709551615假如每秒钟一次,共需多长时间呢?一个平年365天有31536000 秒,闰年366天有31622400秒,平均每年31556952秒,计算一下,18446744073709551615/31556952=584554049253.855年这表明移完这些金片需要5845亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。
汉诺(Hanoi)塔问题(C#版)
⼀个只能⽤递归解决的数学问题;问题描述:古代有⼀个梵塔,塔内有3个座,A、B、C,开始时A座有64个盘,盘⼦⼤⼩不等,⼤的在上,⼩的在下。
有⼀个⽼和尚想把这64个盘⼦从A座移到C座(如图所⽰),但每次只允许移动⼀个盘,且在移动过程中在3个座上始终保持⼤盘在下,⼩盘在上。
在移动地程中可以⾏⽤B座,要求编程序打印出移动的步骤。
逆向推理:1.假如⼀个和尚能把上⾯63个盘⼦先搬到B座,第⼆个和尚再把最⼤的那个移到C,第三个和尚再把63个盘⼦移到C座;⾄此整个⼯作就完成的。
2.问题是怎么才能把63个盘⼦移到B座,按照同样的⽅法,先把62个盘⼦选移到C座
,再把第63个盘⼦移到B座,最后再将62个盘⼦移到B座。
3……如此类推;
4.从上⾯分析可以看出:只有等后⾯那个和尚搬完盘⼦,前⾯的和尚才能够去完成任。
让我们来栈的数据结构:数据的处理只在⼀端处理,且是先进后出。
所以⽤递归的⽅法去处理是正确的。
(汉诺塔图)
汉诺塔问题解决⽅案
如果你发现有什么错误之处,请指出!谢谢了。
hanoi塔梵塔问题一阶谓词逻辑表示汉诺塔问题(Tower of Hanoi)是一个经典的递归问题,可以用一阶谓词逻辑来表示。
假设我们有三个柱子,分别命名为A、B和C。
开始时,所有的盘子都放在柱子A上,目标是将这些盘子移动到柱子C上,每次只能移动一个盘子,并且不能将一个较大的盘子放在较小的盘子上面。
我们可以使用一阶谓词逻辑来表示汉诺塔问题,假设有以下谓词:`On(x, y)`:表示盘子x在柱子y上。
`Move(x, y, z)`:表示将盘子x从柱子y移动到柱子z。
汉诺塔问题的核心在于解决以下递归情况:1. 如果只有一个盘子,那么可以直接将其从起始柱子移动到目标柱子。
2. 如果有多于一个盘子,那么需要先将上面的n-1个盘子从起始柱子移动到辅助柱子上,然后将最大的盘子从起始柱子移动到目标柱子上,最后将n-1个盘子从辅助柱子移动到目标柱子上。
根据上述情况,我们可以使用以下一阶谓词逻辑公式来表示汉诺塔问题:1. `∀x∀y∀z (Move(x, y, z) → ¬On(x, y) & ¬On(x, z))`:表示移动一个盘子时,该盘子不能同时在起始和目标柱子上。
2. `∀x∀y∀z (Move(x, y, z) → (On(x, y) & On(x, z) → y = z))`:表示如果一个盘子同时在两个柱子上,那么这两个柱子必须是同一个。
3. `∀x∀y∀z (Move(x, y, z) → (On(x, y) & On(x, z) → y ≠ z))`:表示如果一个盘子同时在两个柱子上,那么这两个柱子不能是同一个。
4. `∀x∀y∀z (On(x, y) → ¬On(x, z) & z ≠ y)`:表示一个盘子只能放在一个柱子上。
5. `∀x∀y∀z (Move(x, y, z) → (On(x, y) → ¬On(x, z)))`:表示移动一个盘子时,该盘子不能同时在起始和目标柱子上。
一、问题描述汉诺塔问题是一个源自印度的数学问题,它由法国数学家爱德华·卢卡斯在1883年首次提出。
问题的描述如下:有三根柱子A、B、C,A 柱上穿有由小到大的64个圆盘,要求将所有圆盘从A柱移动到C柱上,并且要求在移动过程中始终保持较大的圆盘在下、较小的圆盘在上。
在移动的过程中可以借助B柱。
二、递归算法解决汉诺塔问题的三个步骤1. 确定递归的基本情况:当只有一个圆盘需要移动时,直接将圆盘从A柱移动到C柱即可。
2. 分解子问题:当有n个圆盘需要移动时,可以将其分解为三个子问题:- 将n-1个圆盘从A柱移动到B柱- 将最大的圆盘从A柱移动到C柱- 将n-1个圆盘从B柱移动到C柱3. 递归调用:对上述三个子问题分别递归调用上述步骤,直到递归的基本情况。
三、递归算法求解汉诺塔问题的Python代码实现'''def hanoi(n, source, target, auxiliary):if n == 1:print(f"将圆盘{1}从{source}柱移动到{target}柱")else:hanoi(n-1, source, auxiliary, target)print(f"将圆盘{n}从{source}柱移动到{target}柱")hanoi(n-1, auxiliary, target, source)hanoi(3, 'A', 'C', 'B')'''四、递归算法求解汉诺塔问题的实例演示假设有3个圆盘(n=3),初始状态是所有圆盘都在A柱上,目标状态是所有圆盘都在C柱上。
根据递归算法,我们可以依次执行以下步骤:1. 将2个圆盘从A柱移动到B柱- 将圆盘1从A柱移动到C柱- 将圆盘2从A柱移动到B柱- 将圆盘1从C柱移动到B柱2. 将最大的圆盘3从A柱移动到C柱3. 将2个圆盘从B柱移动到C柱- 将圆盘1从B柱移动到A柱- 将圆盘2从B柱移动到C柱- 将圆盘1从A柱移动到C柱通过上述步骤,我们成功地将3个圆盘从A柱移动到C柱上,且满足汉诺塔问题的要求。
Hanoi塔问题Hanoi塔问题是法国数学家Edouard Lucas于1883年提出来的。
传说有一个东方庙宇(一说为印度,一说为越南)开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为过渡,但每次只能搬一个,而且大的不能放在小的上面。
移动圆片的总次数等于2的64次方再减1=18446744073709551615,如果按照最快每秒钟搬动1片的话,就算昼夜不停地干,要花多少时间?1年有365x24x60x60=31536000秒。
所以共需5849亿年!看来,众僧们耗尽毕生精力也不可能完成金片的移动。
这个问题今天已经成为程序设计中的经典的函数递归调用问题。
此外,还有Hanoi塔电子游戏。
一、需求分析⒈本实验要求4个盘子移动,输出中间结果:三个盘子的图为:三个盘子汉诺塔算法的运行轨迹为:Hanio 算法如下:1 void Hanoi (int n, char A, char B, char C ) //第一列为语句行号2 {3 if (n==1) Move (A, C ); //Move 是一个抽象操作,表示将碟子从A 移到C 上4 else {5 Hanoi (n -1, A, C, B );6 Move (A, C );7 Hanoi (n -1, B, A, C );8 }9 }解释:三根柱子x,y,z.其中x 上有n 个直径递增的圆盘(最顶为最小,然后往下一次增大),现在要把x 上的n 个圆盘移到z 上,要求在移动的过程中不允许出现任何大的圆盘叠放在任何小的圆盘上,柱y 可作中转用).如果柱x 上只有一个圆盘 if(n==1),那么只需要将x 上的这一个圆盘移到z 上即可.程序中的 printf("%c-->%c\n",x,z); 就是把移动的方向打印出来显示在屏幕上.否则(即柱上X 上有不止一个圆盘)else { move(n-1,x,z,y); printf("%c-->%c\n",x,z); move(n-1,y,x,z); }我们先把柱x 上 最上面的(n-1)个圆盘移到柱y(记住柱y 本来就是作中转用的) 上(先不要去深究这n-1个圆盘怎么移得到柱y 上,假设能办到), move(n-1,x,z,y); 注 意此时我们的x,y,z 的角色变了.我们要从x 上移动圆盘到y 上了.你不妨这样标记一 下move 形参 move(圆盘数,来源柱,中转柱,目标柱).就是说现在x 的角色是来源柱,y 的角色是目标柱,我们要把x 上的n-1个圆盘移到y 上.⑸ ⑼ ⑶ Hanio(3,A,B,C) Hanio(3,A,B,C) Hanio(2,A,C,B) Hanio(2,A,C,B) Hanio(1,A,B,C) Hanio(1,A,B,C) Move (A,C) Move (A,B) Hanio(1,C,A,B) Hanio(1,C,A,B) Move (C,B) Move (A,B)Hanio(2,B,A,C) Hanio(2,B,A,C) Hanio(1,B,C,A) Hanio(1,B,C,A) Move (B,C) Hanio(1,A,B,C) Hanio(1,A,B,C) Move (A,C) Move (B,A) 递归第一层 递归第二层 递归第三层 ⑴ ⑵ ⑷⑹ ⑺ ⑻ ⑽⑾ ⑿ ⒀ ⒁这一步完成之后,我们就该把剩在柱x上的那个最大的圆盘移到柱z上了.printf("%c-->%c\n",x,z);现在我们的状态是最大的圆盘已经在z上,其余的n-1个在y上,x上没有圆盘.我们在交换一下x,y,z的角色: move(n-1,y,x,z); 对照move(圆盘数,来源柱,中转柱,目标柱), 我们要把y上剩余的n-1个圆盘移到z上. 自此,n个圆盘全都从x上移到了z上.以此类推,四个盘子的Hanoi塔的问题也是如此解决。