汉诺塔问题

Posted sp1457

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汉诺塔问题相关的知识,希望对你有一定的参考价值。

汉诺塔问题,睡觉前突然看到一个有趣的游戏——汉诺塔问题。然后我就开始思考要怎样才能建立数学模型呢?

假设只有3个圆盘: 那么问题很好解决,我们将圆盘自上而下的编号1-3 ,将柱子编号A B  C  : 

         第一步,我们将1号圆盘放到C 上 ,

         第二步,我们将2号圆盘放到B 上,

         第三步,将1号圆盘从C 放到B 上

         第四步,将3号圆盘从A 放到C 上

         第五步,将1号圆盘从B 放到A上,

   第六步,将2号圆盘从B放到C上

   第七步,将1号从A 放到C上。  这时候完全移动完成

  也就是当n=3的时候,需要7步 (2^3-1)

假设有4个盘子呢? 得到需要15步 

    当 n=4 时,需要(2^4-1)

回来看假设只有一个盘子呢?  直接将1号盘子从A放到C 需要1步(2^1-1)

  所以我们得到了数学模型(2^n-1)

 

那么怎么进行代码的实现呢?  

   对于这种n的数学模型,首先想到的就是递归! 

   是的递归,那么递归结束的条件是什么呢?很显然: 当n=1时。

   那么代码要如何写? 

   这里分析:  三根柱子 A B C 

         第一步,将n-1个盘子放在缓冲柱子B上,(这时候A-->B,C起到缓冲作用)

         第二步,将n号盘子从A放到C上,

         第三步,将n-1个盘子放到C上(这时候B-->C,A起到缓冲作用)

 

package com.count.demo;

import java.util.Scanner;

/**
 *   汉诺塔问题
 * @class HanoiDemo
 * @Description  
 * @audtor sunpeng
 * @date 2018年5月4日
 */
public class HanoiDemo {
    
      private static int m =0;
    
        public static  void move (int n ,char from ,char to)
        {
                 System.out.println("第"+(++m)+"次移动,把"+n+"号盘从"+from+"移动到"+to);
        }
              
        public static void hanio(int n ,char A ,char B ,char C)
        {
            if(n==1)
            {
                HanoiDemo.move(1, A, C);
                //System.out.println("啊哈");
            }else
            {
                hanio(n-1, A, C, B);
                //System.out.println("balabal");
                HanoiDemo.move(n, A, C);
                hanio(n-1, B, A, C);
            }
        }

        
        public static void main(String[] args) {
            
            char A =‘A‘;
            char B =‘B‘;
            char C =‘C‘;
            System.out.println("请输入圆盘的个数");
            Scanner scanner = new Scanner(System.in);
            int n  =  scanner.nextInt();
            HanoiDemo.hanio(n, A, B, C);
            System.out.println("移动了"+m+"次");
            scanner.close();
        }
        
}

这里通过打印来详细的观察了递归进行的顺序。

不得不说印度的神还是真的坑,这样让人搬,谁搬的完?

 

 

 

 

    

以上是关于汉诺塔问题的主要内容,如果未能解决你的问题,请参考以下文章

汉诺塔问题的详解-附代码

C语言汉诺塔问题

代写Haskell程序 汉诺塔汉诺塔编程代码代写

递归_汉诺塔问题

汉诺塔(代码记录+注释)

详解汉诺塔问题