汉诺塔递归算法实现

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

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

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

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

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

1. 汉诺塔可以通过使用递推关系构造模型,递归算法实现。其中移动次数Hn=2Hn1 + 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);
}

    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/yangjunbuaa/article/details/78236663
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞