java详解汉诺塔的递归原理和机制图 So Easy
哈哈哈,汉诺塔怎么玩都晓得了吧!一共三个柱子就是将第一个柱子的盘子(自定义盘子数)都放在第三个柱子上,大盘在下,小盘在上。有兴趣的小伙伴可以去尝试一下64个盘子的!要是能做出来,那么恭喜你,你的寿命比太阳系都要高的多的多!!! 你刚刚是不是会心一笑,那么现在可以开始专注的学习了!(笔者开始学习时都会让自己处于一个开心的状态,这样有助于高效学习——>可以去看看短小的搞笑视频)
首先我们来看一下这段代码
public class Hanoi02{
public static void main(String[] args) {
Hannuota hanoi = new Hannuota();
hanoi.hannuota(3,'A','B','C');
}
}
class Hannuota{
public void hannuota(int n,char A,char B,char C){
if (n == 1) {
System.out.println(A + "->" + C);
}else{
hannuota(n-1,A,C,B);
System.out.println(A + "->" + C);
hannuota(n-1,B,A,C);
}
}
}
运行结果 大家在7K7K上找到相关的汉诺塔游戏玩一下,拿盘数为三的根据上面的代码结果玩一下,验证一下代码的正确性。 不要光看,一定要去玩一下,有助于理解。你可以自己先玩一遍,然后根据代码输出结果跟着走一遍。会有对下面的知识理解有很大的帮助。
接下来我告诉一下大家汉诺塔的原理,慢慢引导大家 我们的目的是要将所有的盘,按大的在下,小的在上放到第三盘上的。 我们要完成这个目标,那么 1.将第一个柱子A上的最后一个盘(第n个)要先放在第三个柱子上C 2.也就是要将A上的n-1这些盘子先放在B柱上 3.然后将A柱的最后一个放到C上 依次类推完成汉诺塔的操作 即,将A柱上只剩下第n个盘,将***其余n-1盘***放到B柱上,然后将第n个盘放在C柱子上,然后将剩下的n-1个盘看成整体n,重复调用本句话,知道所有盘都放到了C柱上。
这个就是大致的一个思路
接下来我们慢慢这个思路引入到编程思想中去 盘数为三时,上面是我们的操作步骤,大家再根据上面步骤,再玩一次,然后玩下看
其实就是往复的利用“n-1”,进行反复递归的操作,完成了最大的盘放到C柱上的操作后,只需要将n-1里的最后一个次大的盘单独放在一个柱子上,剩下的n-1放到另一个柱子上,这里动脑筋!!!,这时就要借助其他的柱子,来完成。 上面的代码我们在类的成员方法的参数列表中定义了方法的参数的个数和类型。三个char类型代表A B C三个柱子。n表示盘数 盘移动到柱子上的操作其实就相当于变量和变量的相互赋值
int a = 10;
int b;
b = a;
也就是代码的这个部分
只不过这里是char类型的参数,这里对不了解递归操作机制的同学可能会一脸懵,没有关系,下面就来给大家解懵 我们在main函数中创建好hanoi对象(实例化对象)以后,去调用Hannuota类中的成员方法。
class Hannuota{
public void hannuota(int n,char A,char B,char C){
if (n == 1) {
System.out.println(A + "->" + C);
}else{
hannuota(n-1,A,C,B);
System.out.println(A + "->" + C);
hannuota(n-1,B,A,C);
}
}
}
这个语句System.out.println(A + “->” + C);我们的递归操作就是要将输出的char参数进行赋值,这样来达到移动盘到柱子(借助其他的柱子)。知道了这些,我们来画画这里代码的运行机制图。 这里先给出我手画出来的,字难看了点(捂脸),大家可以截一下图,翻转一下来看。一会我会一步步去解释 下面具体说一下代码的调用机制图,和返回输出值的步骤
class Hannuota{
public void hannuota(int n,char A,char B,char C){
if (n == 1) {
System.out.println(A + "->" + C);
}else{
hannuota(n-1,A,C,B);
System.out.println(A + "->" + C);
hannuota(n-1,B,A,C);
}
}
}
在main函数调用我们的方法时,这个方法就会在栈中创建一个独立的空间,每个栈空间又会调用该方法,调用几次产生几个独立的空间。 如下图所示。 调用顺序: 输出顺序在图上进行了标注。 对变量进行赋值的步骤在我手画的那张图上,如果对赋值这块容易懵的,大家可以看看。
|