游戏规则:有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要将A杆子上的圆盘复刻到C上,并且一次只能移动一个圆盘。
比较经典的算法,基本都知道
分析:
1:当A上圆盘数n=1时,直接放入C即可
2:当A上圆盘数n>1时,需要借助辅助杆B
1)n=2,时
2)n>2时,只需将上面看成一个整体,问题就会回归到上面,由于一次只能移动一个,所以上面的整体需要递归处理。
package com.day16;
/**
* Hanoi tower.
*/
public class Hanoi {
/**
*********************
* Move a number of plates.
*
* @param paraSource
* The source pole.
* @param paraIntermediary
* The intermediary pole.
* @param paraDestination
* The destination pole.
* @param paraNumber
* The number of plates.
*********************
*/
public static void hanoi(char paraSource, char paraIntermediary, char paraDestination,
int paraNumber) {
if (paraNumber == 1) {
System.out.println(paraSource + "->" + paraDestination + " ");
return;
} // Of if
hanoi(paraSource, paraDestination, paraIntermediary, paraNumber - 1);
System.out.println(paraSource + "->" + paraDestination + " ");
hanoi(paraIntermediary, paraSource, paraDestination, paraNumber - 1);
}// Of hanoi
/**
*********************
* The entrance of the program.
*
* @param args
* Not used now.
*********************
*/
public static void main(String args[]) {
hanoi('a', 'b', 'c', 3);
}// Of main
}// Of class Hanoi
虽然代码超级简单,但是要理清还是要费点功夫。代码分析:
前三个参数分别代表不同的杆子,最后一个参数代表初始A杆子上的圆盘数;递归的出口即最简单的 n =1的情况,此时需要进行操作,这里只模拟位置的移动。并且我们通过调换参数的位置,即可用相同的语句实现不同的移动操作,这一点我感觉是挺厉害的,并且参数位置的不同还能控制其奇数次递归与偶数次递归的细微差别, 只能说不愧是经典算法,简化到不能再简化。下面是n=2,n=3的运行结果: