1. Hanoi塔
1.1 问题描述
有三根柱子有n个大小不同的圆盘需要从1号移动到3号(如图),有三条规则:每次只能移动一个圆盘;大的盘不能放小的之上;除非圆盘在移动中不然必须所有圆盘某个立柱上。
1.2 问题分析
要解决这个问题需要分三步:首先把上面n-1个圆盘放到辅助2号上,然后把最大的一个圆盘放在3号上,把2号的n-1个放到3号上面去。
- 要把1号立柱上面的n-1的圆盘放到2号上,此时把3号作为辅助立柱,就要把上面n-2个放到3号上去;要把上面n-2的圆盘放到3号上,此时把2号作为辅助立柱,就要把上面n-3个放到2号上去,以此类推,最后让1号上面只剩最后一个。
- 当最大盘被放入3号时,此时的问题就变成了一个n-1阶的问题,即把2号的n-1个圆盘放到3号上面,然后同上。
1.3 代码实现
public static void hanoi(char paraSource, char paraIntermediary, char paraDestination, int paraNumber) {
// 递归出口
if (paraNumber == 1) {
System.out.println(paraSource + "->" + paraDestination + " ");
return;
} // Of if
//把上面n-1个从起始立柱放到辅助立柱.
hanoi(paraSource, paraDestination, paraIntermediary, paraNumber - 1);
//把剩下的最大圆盘从起始立柱放到目标立柱.
System.out.println(paraSource + "->" + paraDestination + " ");
//把n-1个圆盘从辅助立柱放到目标立柱.
hanoi(paraIntermediary, paraSource, paraDestination, paraNumber - 1);
} // Of hanoi
2. 示例
package datastructure.tree;
/**
* Hanoi tower.
*
* @author Yunhua Hu yunhuahu0528@163.com.
*/
public class hanoi {
/**
*********************
* Move a number of plates.
*
* @param paraSource
* The source pole.
* @param paraIntermediaray
* 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
public static void main(String args[]) {
hanoi('a', 'b', 'c', 3);
}// Of main
}// Of class Hanoi
输出:
问题: 代码看其表明来抽象理解还行,往里递归着走就有点绕,还得多理理。