java 实现汉诺塔详解及实现代码

所属分类: 软件编程 / java 阅读数: 26
收藏 0 赞 0 分享

java 实现汉诺塔详解及实现代码

汉诺塔问题:有三根柱子A,B,C,其中A上面有n个圆盘,从上至下圆盘逐渐增大,每次只能移动一个圆盘,并且规定大的圆盘不能叠放在小的圆盘上面,现在想要把A上面的n个圆盘全部都移动到C上面,输出移动的总步数以及移动的过程

分析:

//先求出移动的总步数
1,假设g(n)表示n个圆盘时的移动总的步数,当n=1时,g(1)=1;

2.现在可以把g(n)进行细分为三步:
  1>先将n-1个圆盘从A通过C移动到B上面,相当于将n-1个圆盘从A移动到C,因此需要g(n-1)步;
  2>然后将剩下的最大的圆盘从A移动到C,需要1步;
  3>最后再将n-1个圆盘从B通过A移动到C上面,相当于将n-1个圆盘从A移动到C,因此也需要g(n-1)步;
因此可以得出递归关系式:g(n) = 2*g(n-1)+1;

//现在我们在来求出移动的过程
1.假设hm(m,a,b,c)表示将m个圆盘从a通过b移动到c的过程,假设mv(a,c)输出一次a到c的过程,即print a-->c

2.初始化hm,当m=1时,hm(1,a,b,c)=mv(a,c);
2.可以把hm(m,a,b,c)进行细分为三步:
  1>先将n-1个圆盘从A通过C移动到B,此时b和c进行互换,也就是 hm(m-1,a,c,b);
  2>然后将剩下的最大的圆盘从A移动到C,也就是hm(1,a,b,c);
  3>最后将n-1个圆盘从B通过A移动到C,此时b和a进行交换,也就是 hm(m-1,b,a,c);
最终得到过程的递归关系式:hm(m,a,b,c) = hm(m-1,a,c,b)+1+hm(m-1,b,a,c);

实现代码:

public class test{
  public static void main(String[] args){
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();
    test t = new test();
    //获取总的步数
    System.out.println("需要移动的总步数为:" +t.getSum(n));
    //获取移动的过程
    t.hm(n,'a','b','c');
  }
  //获取总步数
  public int getSum(int n){
    if(n == 1) 
      return 1;
    return 2 * getSum(n-1) +1 ;
  }

  //获取移动的过程
  public void hm(int m,char a,char b,char c){
    if(m == 1)
      move(a,c);
    hm(m-1,a,c,b);
    move(a,c);
    hm(m-1,b,a,c);
  }

  //输出一次移动的过程
  public void move(char a,char c){
    System.out.print(a + "-->" + c + "  ");
  }
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

更多精彩内容其他人还在看

Java的面向对象编程基本概念学习笔记整理

这篇文章主要介绍了Java的面向对象编程基本概念学习笔记整理,包括类与方法以及多态等支持面向对象语言中的重要特点,需要的朋友可以参考下
收藏 0 赞 0 分享

Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法

这篇文章主要介绍了Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法 的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

基于Java实现杨辉三角 LeetCode Pascal's Triangle

这篇文章主要介绍了基于Java实现杨辉三角 LeetCode Pascal's Triangle的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Java中Spring获取bean方法小结

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中获取Spring配置的bean呢?下面通过本文给大家介绍Java中Spring获取bean方法小结,对spring获取bean方法相关知识感兴趣的朋友一起学习吧
收藏 0 赞 0 分享

如何计算Java对象占用了多少空间?

在Java中没有sizeof运算符,所以没办法知道一个对象到底占用了多大的空间,但是在分配对象的时候会有一些基本的规则,我们根据这些规则大致能判断出来对象大小,需要的朋友可以参考下
收藏 0 赞 0 分享

剖析Java中的事件处理与异常处理机制

这篇文章主要介绍了Java中的事件处理与异常处理机制,讲解Java是如何对事件或者异常作出响应以及定义异常的一些方法,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Java的Struts2框架的结构及其数据转移方式

这篇文章主要介绍了详解Java的Struts2框架的结构及其数据转移方式,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

Java封装好的mail包发送电子邮件的类

本文给大家分享了2个java封装好的mail包发送电子邮件的类,并附上使用方法,小伙伴们可以根据自己的需求自由选择。
收藏 0 赞 0 分享

在Java的Struts中判断是否调用AJAX及用拦截器对其优化

这篇文章主要介绍了在Java的Struts中判断是否调用AJAX及用拦截器对其优化的方法,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

java多线程Future和Callable类示例分享

JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。今天我们就来研究下Future和Callab
收藏 0 赞 0 分享
查看更多