//=================================================
// 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. python环境搭建-设置PyCharm软件的配色方案和Python解释器

    设置PyCharm软件的配色方案 设置Python解释器(用于Python2 or 3 的切换)

  2. Java面试常考知识点

    1.  什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件. Jav ...

  3. Gson解析json数据

    1.解析单个对象 JSON字符串如下 [ { "formatDate":"2015-10-28", "date":"2015\u5 ...

  4. linux 远程桌面连接

    我们知道在windows下面我们可以用远程桌面连接来控制其它电脑, 但linux 远程桌面连接?不过在说怎样连接之前还是要先明确一个概念,为什么我标题没有用linux中的远程桌面连接呢, 这是因为Li ...

  5. ListView上拉加载,下拉刷新 PullToRefresh的使用

    PullToRefresh是一套实现非常好的下拉刷新库,它支持:ListViewExpandableListViewGridViewWebViewScrollViewHorizontalScrollV ...

  6. [转]servlet中的service, doGet, doPost方法的区别和联系

    原文地址:http://m.blog.csdn.net/blog/ghyg525/22928567 大家都知道在javax.servlet.Servlet接口中只有init, service, des ...

  7. 【CodeVS 1199】【NOIP 2012】开车旅行

    http://codevs.cn/problem/1199/ 主要思想是倍增,对于第一个回答从后往前扫,依次插入平衡树中. 我写的splay,比较繁琐. #include<cmath> # ...

  8. 【UOJ #150】【NOIP 2015】运输计划

    http://uoj.ac/problem/150 用树链剖分求lca,二分答案树上差分判断. 时间复杂度$O(nlogn)$,n,m同阶. #include<cstdio> #inclu ...

  9. 给<tr>标签添加边框

    今天做网站时发现给<tr>添加border无效.起初还以为tr不支持这个属性,百度,原来只要给<table>添加一句代码就可以了,代码如下: table{border-coll ...

  10. bzoj2653: middle

    首先,对于每个询问,我们二分答案 然后对于序列中大于等于中位数的数,我们把它们置为1,小于中位数的数,置为-1 那么如果一个区间和大于等于0,那么就资磁,否则就不滋磁 这个区间和呢,我们可以用主席树维 ...