//=================================================
// 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. 转 Linux 性能优化之 IO 子系统

    本文介绍了对 Linux IO 子系统性能进行优化时需要考虑的因素,以及一些 IO 性能检测工具. 本文的大部分内容来自 IBM Redbook - Linux Performance and Tun ...

  2. Hibernate @OneToMany 一对多注解

    配置一 @OneToMany(cascade=CascadeType.ALL) @JoinColumn(name="fatherID") //对应儿子类的哪个字段 子类中配置Man ...

  3. 如何更新firefox中的flash

    要了解当前安装的版本是否为最新版本,请访问 插件检查页面http://www.mozilla.com/plugincheck/  ,如果该页面告诉你 Flash 插件需要更新,请手动安装最新版本. 使 ...

  4. perl 变量 $/ 的用法解析

    默认状态下,很显然都是用\n来区分行,\n也被我们称作为换行符.当读取序列时,按行来读取时,就是以换行符为标准. perl中"行"的概念就由$/决定. { $data = &quo ...

  5. 操作系统中的IPC机制

    按发送路径来看,可分为直接通信和间接通信. 1. 直接通信 (1)进程必须正确的命名对方 send (P, message) – 发送信息到进程P receive(Q, message) – 从进程 ...

  6. Android成长日记-Android监听事件的方法

    1. Button鼠标点击的监听事件 --setOnClickListener 2. CheckBox, ToggleButton , RadioGroup的改变事件 --setOnCheckedCh ...

  7. hdu 5023 线段树

    成端更新+统计区间内的值 挺模板的题... 一开始没想起来用set统计,傻傻地去排序了[大雾 #include<iostream> #include<cstdio> #incl ...

  8. duxcms SQL Injection In /admin/module/loginMod.class.php

    目录 . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 duxcms是一款采用PHP开发,基于HMVC规则开发适合中小企业.公司.新闻.个 ...

  9. Java过滤器与SpringMVC拦截器之间的关系与区别

    今天学习和认识了一下,过滤器和SpringMVC的拦截器的区别,学到了不少的东西,以前一直以为拦截器就是过滤器实现的,现在想想还真是一种错误啊,而且看的比较粗浅,没有一个全局而又细致的认识,由于已至深 ...

  10. HDU 5907 Find Q(简单字符串)

    传送门 Description Byteasar is addicted to the English letter 'q'. Now he comes across a string S consi ...