问题描述
庙里的和尚,闲得无聊,庙中有三个柱子,分别标记为柱子A,柱子B,柱子C.
柱子A有三个盘子,这三个盘子呢,直径最大的放在最下面,第二大的放中间,最小的放最上面。
柱子B是空的。
柱子C也是空的。
如果A柱子上的盘子能借助B 搬到C柱子上,并切盘子顺序是跟原先A上一致。做这个过程和尚感觉是非常有意思的。没办法,吃饱了撑的。
当然这里面有两个规则
1 第次只能搬一个
2 不能将大直径的放到小直径上面
分析问题
假设A上面有N个盘子,如果我呢把N-1个盘子已经搬到了B上面,我只需要将A盘子放到这个C上面,第N个盘子的直径是最大的,再以后的搬动过程中是不需要动C上第N个盘子的。以上搬动N个盘子的问题,就变为搬N-1个盘子的问题。如此规则执行下去,只后只有一个圆盘的时候,问题直接解决了。
这种方式适合递归算法
1 有递归出口,那就是当盘子只有一个时候,问题很简单,直接解决
2 有策略能使问题规模缩小,并且问题是相似,
a 将N-1个盘子从A 搬到B柱上面,(借助C)
b 将A柱子上第N个盘子搬到C柱上面
c 将B柱子上N-1个盘子搬到C柱子上面 (借助A)
OK 那java实现为
public void hanioAlgorithms(int n,String A,String B,String C){ if (n==1 ) { move(1,A,C); return; } hanioAlgorithms(n-1,A,C,B); this.move(n, A, C); hanioAlgorithms(n-1, B, A, C); } private void move(int n ,String A,String C){ System.out.println("将第"+n+"个盘子 从"+A+"移动到"+C); } }