汉诺塔问题

#####提示:汉诺塔问题是程序设计中的经典递归问题 ,使用递归解决,统计递归调用的次数即可。
编写代码前我们先来阅读一个关于汉诺塔的小故事!

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。
该传说说大梵天创造世界的时候做了三根金刚石柱子A,B,C,在一根柱子上从下往上按照大小顺序摞着20片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘.僧侣们预言,当所有的黄金圆盘都从梵天穿好的那根柱子上移到另外一根柱子上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。

现在要求将A柱上的盘子全部移到C柱上面,问需要移动多少次。

先说说解决思路

假设(前)“将N-1个盘子从A针移动到B针”所需次数为F(n-1),总移动次数为F(n)
中间的盘子B作为中转站一般地工作
当A把最后一个盘子放到C后
再将B上的N-1个盘子移动到C上,那么还是需要F(n-1)次
**得到我们结论公式F(n) = 2 F(n-1) + 1,F(1) = 1 **

代码如下:

    public class Test {
	  public static void main(String[] args) {
		int n=hnt(20);//定义汉诺塔一共20个盘子
		System.out.println(n);//输出次数
	  }
	  public static int hnt(int x) {
		if(x==1)
			return 1;
		return hnt(x-1)*2+1;//x-1是把临界条件下a最大的盘子放到c的最下面
							//*2是因为要把临界情况前后都相当于(n-1)!汉诺塔问题
							//+1是因为临界条件上的一次						
	  }
    }

我们可以看下图片来理解一下,方便理顺思路
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值