//=================================================
// File Name : Tower_demo
//------------------------------------------------------------------------------
// Author : Common //主类
//Function : Tower_demo
public class Tower_demo { static int nDisks = 3; public static void main(String[] args) {
// TODO 自动生成的方法存根
doTower(nDisks, 'A', 'B', 'C');
} public static void doTower(int topN,char from,char inter,char to){
if(topN == 1)
System.out.println("Disk 1 from "+from+" to "+to);
else{
doTower(topN-1, from, to, inter);
System.out.println("Disk "+topN+" from "+from+" to "+to);
doTower(topN-1, inter, from, to);
}
} }

通过二叉树的中序遍历过程来分析汉诺塔问题:

考虑A、B、C三根柱子,A上从上到下有1、2、3三个数,要把A上的数移动到C上,其过程应该是

      A  B  C

初始  123

A->C   23     1

A->B   3  2   1

C->B   3   12  

A->C      12  3

B->A   1  2   3

B->C   1      23

A->C          123

可以写成下图二叉树的中序遍历

在程序中有两个输出语句,

结束条件中的数据语句输出的是二叉树中的叶子结点

递归左子树和递归右子树中间的输出语句输出是所有的非叶子结点

所有左孩子和右孩子输出语句中得到的实际参数都是其父结点传递的,根节点输出语句得到的参数是初始传递的参数

<1>首先确定递归函数的形式

doTower(int topN,char from,char inter,char to)

<2>在main中给根节点传递的初始值为(A,B,C)

对于根节点的输出A->C

可以确定递归左子树和递归右子树中间的输出语句应该输出 from->to,即

System.out.println("Disk "+topN+" from "+from+" to "+to);

<3>步骤<2>确定了递归左子树和递归右子树中间的输出语句的格式,

对于根节点(A->C)的左孩子(A->B)和右孩子(B->C),由于都是非叶子结点,所以它们使用的仍然是递归左子树和递归右子树中间的输出语句 from->to

所以对于左孩子(A->B),要输出(A->B),可以确定出给其传递的参数应该是(A,C,B)

对于右孩子(B->C),要输出(B->C),可以确定出给其传递的参数应该是(B,A,C)

又因为所有左孩子和右孩子输出语句中得到的实际参数都是其父结点传递的,由于父节点得到的实参是(frmo=A,inter=B,to=C)

左孩子要想得到(A,C,B),给其传递的顺序应该是(from,to,inter)

右孩子要想得到(B,A,C),给其传递的顺序应该是(inter,from,to)

即确定了

doTower(topN-1, from, to, inter);

doTower(topN-1, inter, from, to);

<4>最后确定结束条件中的输出语句的输出顺序

由于上一步确定了

doTower(topN-1, from, to, inter);

doTower(topN-1, inter, from, to);

对于A->B的左孩子A->C,由于在A->B结点中,from=A,inter=C,to=B,所以执行了doTower(topN-1, from, to, inter)后,给A->C传递的参数应该是(A,B,C),想要输出A->C,可以确定结束条件中的输出语句为

System.out.println("Disk 1 from "+from+" to "+to);

同理,对于A->B的右孩子C->B,由于在A->B结点中,from=A,inter=C,to=B,所以执行了doTower(topN-1, inter, from, to)后,给C->B传递的参数应该是(C,A,B),可以输出C->B

Java递归算法——汉诺塔问题的更多相关文章

  1. Java-Runoob-高级教程-实例-方法:03. Java 实例 – 汉诺塔算法-un

    ylbtech-Java-Runoob-高级教程-实例-方法:03. Java 实例 – 汉诺塔算法 1.返回顶部 1. Java 实例 - 汉诺塔算法  Java 实例 汉诺塔(又称河内塔)问题是源 ...

  2. java 解决汉诺塔问题

    //汉诺塔问题//HanYang 2016/10/15 import java.util.Scanner; //输出public class Hanuota { public static void ...

  3. java实现汉诺塔算法

    package com.ywx.count; import java.util.Scanner; /** * @author Vashon * date:20150410 * * 题目:汉诺塔算法(本 ...

  4. Java实现汉诺塔问题

    1 问题描述 Simulate the movement of the Towers of Hanoi Puzzle; Bonus is possible for using animation. e ...

  5. java实现汉诺塔计数

    ** 汉诺塔计数** 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具. 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下 ...

  6. Java求解汉诺塔问题

    汉诺塔问题的描述如下:有3根柱子A.B和C,在A上从上往下按照从小到大的顺序放着一些圆盘,以B为中介,把盘子全部移动到C上.移动过程中,要求任意盘子的下面要么没有盘子,要么只能有比它大的盘子.编程实现 ...

  7. Java实现汉诺塔移动,只需传一个int值(汉诺塔的阶)

    public class HNT { public static void main(String[] args) { HNT a1 = new HNT(); a1.lToR(10); //给汉诺塔a ...

  8. python实现汉诺塔

    经典递归算法汉诺塔分析: 当A柱子只有1个盘子,直接A --> C 当A柱子上有3个盘子,A上第一个盘子 --> B, A上最后一个盘子 --> C, B上所有盘子(1个) --&g ...

  9. python递归——汉诺塔

    汉诺塔的传说 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了 ...

随机推荐

  1. [转]十步完全理解SQL

    原文地址:http://blog.jobbole.com/55086/ 很多程序员视 SQL 为洪水猛兽.SQL 是一种为数不多的声明性语言,它的运行方式完全不同于我们所熟知的命令行语言.面向对象的程 ...

  2. [转]FastJSON通过SerializeFilter定制序列化

    原文地址:https://github.com/alibaba/fastjson/wiki/SerializeFilter 简介 SerializeFilter是通过编程扩展的方式定制序列化.fast ...

  3. Swift基础--Swift中的分类以及在分类中扩展init方法的注意事项

    Swift中的分类 1.创建一个空的swift文件 2.关键字extension,格式: extension 要扩展的类名 {} extension UIButton { } Swift中扩展init ...

  4. iOS开发中的错误整理,再一次整理通过通知中心来处理键盘,一定记得最后关闭通知中心

    一.打开通知中心,监听键盘的显示与隐藏 二.最后记得将监听通知的对象移除

  5. SpringTest框架JUnit单元测试用例获取ApplicationContext实例的方法

    步骤 1.继承AbstractJUnit4SpringContextTests 2.引入ApplicationContext 示例代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

  6. 模板题 codevs 1993 草地排水 想学习的请看链接

    不能再水的题了. Dinic算法,比EK更快. 想要学习请看链接   https://comzyh.com/blog/archives/568/ 并附上我的模板(其实和comzyh大神的一样) #in ...

  7. 使用android studio时提示Unable to access Android SDK add-on list

    这个界面不用管,点击Cancel.到一个界面下边有个”Android SDK Location:“这个选路径的时候选你的android sdk的路径就好了.以后再打开就不会再报这个错了.

  8. HDFS源码分析:NameNode相关的数据结构

    本文主要基于Hadoop1.1.2分析HDFS中的关键数据结构. 1 NameNode 首先从NameNode开始.NameNode的主要数据结构如下: NameNode管理着两张很重要的表: 1)  ...

  9. Sql Server日期查询-SQL查询今天、昨天、7天内、30天

    今天的所有数据: 昨天的所有数据: 7天内的所有数据: 30天内的所有数据: 本月的所有数据: 本年的所有数据: 查询今天是今年的第几天: select datepart(dayofyear,getD ...

  10. rsync服务器安装配置

    #rsync指定端口号(10002)1 rsync -e 'ssh -p 10002' rsync (server -- client) #2014-3-3 -----------server---- ...