版权声明:转载请注明出处,谢谢 https://blog.csdn.net/acDream_/article/details/86572537
一、汉诺塔游戏规则
有A,B,C三个柱子,在A柱上有1~N个圆盘,将1~N个圆盘从A柱移动到C柱,移动过程中始终保持小盘在上,大盘在下
递归思路1:
- 将问题划分为1盘移动到B柱,2~N个圆盘移动到C柱的子问题
- 如果这样划分我们可以推演一下
①先将1盘移动到B柱
这里肯定是没问题的
②再将2~N移动到C柱
如果按这种方法,你会发现,你不移动A柱上的圆盘不行,如果移动A柱上圆盘也不知道往哪里移
所以这种划分方法是失败的
递归思路2:
- 将问题划分为将1~(N-1)个圆盘从A柱移动到C柱,以B柱作为辅助柱
- 再将第N个圆盘移动到B柱
- 再将1~(N-1)个圆盘从C柱移动到B柱,将A柱作为辅助柱
- 按这种思路可以推演一次
- 最后一步:这里把1号盘从A柱移动到C柱就可以了
知道思路了,那么代码实现就不难了
public static void hanoi(char a,char b,char c,int n){ if(n==0){ return; } //先将1~N-1个圆盘从A柱移动到B柱,C柱作为辅助柱 hanoi(a,c,b,n-1); System.out.println("移动第"+n+"个圆盘,"+a+"-->"+c); //再将1~N-1个圆盘从B柱移动到C柱,将A柱作为辅助柱 hanoi(b,a,c,n-1); }
二、汉诺塔圆盘移动次数
- 由递归的思路可以知道,我们是先将N-1个圆盘移动从A盘移动到B盘的,再将第N个圆盘移动到C盘的,在将N-1个圆盘从B盘移动到C盘
- 所以从这里很容易看出N个圆盘的汉诺塔移动次数是2*(N-1)个圆盘的汉诺塔移动的次数+1
实现代码:
public static long hanoi(int n){ if(n==1){ return 1; } return 2*hanoi(n-1)+1; }
扫描二维码关注公众号,回复: 5013512 查看本文章