汉诺塔递归算法实现

汉诺塔由安装在一个板上的3根柱子和若干大小不同的盘子构成。开始时,

 这些盘子按照大小的次序放在第一根柱子上,大盘子在底下。游戏规则是:

 每一次把1个盘子从一根柱子移动到另一根柱子,但是不允许这个盘子放在

 比它小的盘子上面。游戏的目标是把所有的盘子按照大小次序都放到第根柱

 子上,并且将最大的盘子放在底部。

1. 汉诺塔可以通过使用递推关系构造模型,递归算法实现。其中移动次数Hn=2Hn-1 + 1=2*exp(2)-1移动次数完成移动。

2. 总共有A,B,C 3根柱子,初始盘子按大小堆叠在A柱,目标把盘子由A柱移动到B柱,C为中间柱子。


以下是汉诺塔递归函数JAVA代码实现:

/*
* @param n: 需移动汉诺塔盘碟的数目(n>=2)
* @param A: 初始盘碟所在柱子
* @param B: 目标移动的柱子
* @param C: 中间柱子
*/
static void HanNuoTaMove(int n, char A, char B, char C){
 // 递归基础(初始)实现
 if(n==2){
    System.out.println("1号盘子由:"+A+"柱子移动到:"+C+"柱子");
    System.out.println("2号盘子由:"+A+"柱子移动到:"+B+"柱子");
    System.out.println("1号盘子由:"+C+"柱子移动到:"+B+"柱子");
    return;
  }
	
 //把n个盘子看成成n和n-1两个盘子, n-1个盘子看成一个整体进行移动
//先把n-1这个盘子移动到C柱上,B柱做为中间桥梁柱子(递归调用实现)
 HanNuoTaMove(n-1, A, C, B);
 //n号盘子移动到目标B柱上
 System.out.println(n+"号盘子由:"+A+"柱子移动
 到:"+B+"柱子");
 //再把n-1个柱子从中间桥梁柱子移动到目标B柱上(递归调用实现)
 HanNuoTaMove(n-1, C, B, A);
}

以下是通过栈的方式JAVA代码实现:

/**
* 汉诺塔栈(Stack)实现
* @param A: 初始堆叠盘子栈
* @param B: 目标堆叠盘子栈
* @param C: 中间桥梁盘子栈
*/
static void HanNuoTaStack(int n, Stack<Integer> A, Stack<Integer> B, Stack<Integer> C){
 if(n==2){
  C.push(A.pop());
  B.push(A.pop());
  B.push(C.pop());
  return;
 }
		
 HanNuoTaStack(n-1, A, C, B);
 B.push(A.pop());
 HanNuoTaStack(n-1, C, B, A);
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值