递归经典例题之汉诺塔问题

汉诺塔问题:

有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请问怎么移动。

假设只有三个盘子编号为1,2,3具体做法就是:

1盘子从a->b

2盘子从a->c

1盘从b->c

3盘从a->b

1盘从c->a

2盘从c->b

1盘从a->b

三个盘子的移动需要七次,这个是我们通过人脑自己按照想法想出来的

具体编程思想是什么?

基本思想:使用递归,并且需要懂得划分思想

具体划分思想就是,设A盘为起始位置,B盘为终止位置,C盘就是辅助位置

有n个盘子从a到b的具体划分就是:

1.n-1个盘子从a到c             以b盘为辅助

2.把第n个盘子从a到b

3.把剩下的n-1个盘子从c->b    以a为辅助

就可以把盘子从起始位置放置到终止位置,其中不断改变的量就是a,b,c三个位置的身份,比如,从a->c a起始位置 c终止位置 b就是辅助位置 c->b 就是c是起始位置 b是终止位置 a辅助位置 另外一个不断改变的量就是盘子移动的数目,每次移动完成都会少一个需要移动的,把上述变量作为递归函数变化的参数就可以

具体代码如下:

public class Mains{
	public static void main(String[] args) {
		f(3,"a","b","c");
	}
	public static void f(int n,String start,String end,String help){
		if(n==1){
			System.out.println("n="+n+"start:"+start+"->end:"+end);
			return;
		}
		f(n-1,start,help,end);//从起始位置到辅助位置 结束位置作为辅助位置
		System.out.println("n="+n+"start:"+start+"->end:"+end);
		f(n-1,help,end,start);//把辅助位置变成起始位置到结束位置,把开始位置作为辅助位置
	}
}

喜欢的记得点个关注哟!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值