2.6 递归经典问题:汉诺塔游戏与汉诺塔圆盘移动次数

版权声明:转载请注明出处,谢谢 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.    
  2.    
  3.    
  4.    
  5.    
  6.    
  7.    最后一步:这里把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 查看本文章

猜你喜欢

转载自blog.csdn.net/acDream_/article/details/86572537
今日推荐