java详解汉诺塔的递归原理和机制图 So Easy

java详解汉诺塔的递归原理和机制图 So Easy

哈哈哈,汉诺塔怎么玩都晓得了吧!一共三个柱子就是将第一个柱子的盘子(自定义盘子数)都放在第三个柱子上,大盘在下,小盘在上。有兴趣的小伙伴可以去尝试一下64个盘子的!要是能做出来,那么恭喜你,你的寿命比太阳系都要高的多的多!!!
你刚刚是不是会心一笑,那么现在可以开始专注的学习了!(笔者开始学习时都会让自己处于一个开心的状态,这样有助于高效学习——>可以去看看短小的搞笑视频)

首先我们来看一下这段代码

public class Hanoi02{
	public static void main(String[] args) {
	    //3.创建一个对象,有的地方也叫实例化一个对象
	    // 类名  自己起一个名 = new 类名();  
		Hannuota hanoi = new Hannuota();
		//4.对类为Hannuota的hannuota成员方法进行调用
		hanoi.hannuota(3,'A','B','C');  
		//三个柱子char类型保存  A B C
	}
}
//  1.这是第一步哦!先创建一个Hannuota类,这里的标志符命名不是很规范昂!
class Hannuota{
    // 2.创建一个hannuota的成员方法
    // 修饰符 返回值类型 方法名 ()参数列表 { }方法体
    // 这里我们用void返回值类型,可以不写return
	public void hannuota(int n,char A,char B,char C){
	    //  n 代表盘数  三个柱子我们用char类型保存  A B 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{
	//该方法体只是对步骤的说明所以没有返回值 用 void
	public void hannuota(int n,char A,char B,char C){
	    //  n 代表盘数  三个柱子我们用char类型保存  A B C
	    //int n = 4
	    //char A = 'A';
	    //char B = 'B';
	    //char C = 'C';
		if (n == 1) {
			System.out.println(A + "->" + C);
			//当A柱或者B柱只剩下最大或者次大的盘直接放到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{
	//该方法体只是对步骤的说明,所以没有返回值 用 void
	public void hannuota(int n,char A,char B,char C){
	    //  n 代表盘数  三个柱子我们用char类型保存  A B C
	    //int n = 4
	    //char a = 'A';
	    //char b = 'B';
	    //char c = 'C';
		if (n == 1) {
			System.out.println(A + "->" + C);
			//当A柱或者B柱只剩下最大或者次大的盘直接放到C
		}else{
			//这里的代码看不懂没有关系,继续往下看
			hannuota(n-1,A,C,B);
			System.out.println(A + "->" + C);
			hannuota(n-1,B,A,C);
		}
	}
}

在main函数调用我们的方法时,这个方法就会在栈中创建一个独立的空间,每个栈空间又会调用该方法,调用几次产生几个独立的空间。 如下图所示。
在这里插入图片描述
调用顺序:
在这里插入图片描述
输出顺序在图上进行了标注。
对变量进行赋值的步骤在我手画的那张图上,如果对赋值这块容易懵的,大家可以看看。

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值