zoukankan      html  css  js  c++  java
  • 【java数据结构】递推解决的汉诺塔问题

    在学习数据结构的时候,遇到汉诺塔问题,就写了自己的理解,希望对您有帮助。

    package com.qxlx.six;
    
    /**
     * 递推解决的汉诺塔问题
     * 
     * @author jia
     *
     */
    public class TowerApp {
    
    	public static void main(String[] args) {
    		doTowers(3, 'A', 'B', 'C');
    	}
    
    	/**
    	 * 理解:汉诺塔问题 如果试图要移动的盘子是奇数个盘子,开始时直接把最顶端的盘子移动到想要把这颗树移动到的那个数上
    	 * 如果视图要移动的盘子是偶数个盘子,开始时直接把最顶端的盘子移动到中介塔座上。 如何理解这个问题, 假设把问题具体化,典例话,
    	 * 现在假象这样一种情况,如果在A处只有一个盘子的话,想要将这一个盘子直接移动到C处,那么就可以直接
    	 * 移动到C处了。这是奇数的情况下,但是如果是偶数,或者是0个盘子的话,那么就需要先将A处最上面的那个盘子
    	 * 先移动到B处,将A处最后一个盘子移动到C处。然后将B处的盘子移动到C处,这样的话,就可以实现了目的。
    	 * 
    	 * 
    	 * xiaogong 理解:假设初始盘子数目为奇数,那么最上面的盘子一定先从A到C,即递归到最后一层时,topN == 1,
    	 * 所以from、inner、to的值分别为‘A’‘B’‘C’。那么此层递归完毕,返回上层递归。由于此层递归是
    	 * 最上面的盘子从A到C,那么上一层递归也就是下一步操作一定第二个盘子是A到B,【那么上一层的from、
    	 * inner、to一定是‘A’‘C’‘B’!!!】。将第二个盘子移到B了以后,第三步操作毋庸置疑是将先前
    	 * 移到C的第一个盘子移到B,应该再递归一次,并且.已经知道了from、inner、to的值。此时,我们已经分
    	 * 析完了最里面两层的操作。第三层的参数又是什么呢?其实这时候又回归了第一层,即from、inner、to
    	 * 的值分别为‘A’‘B’‘C’。这一步操作是将第三个盘子从A移到C。这一层还有一个递归操作是将B上面
    	 * 的两个盘子移到C即第三个盘子上面。至此,3个盘子已经完美地从A移到了C。如果还有第四个、第五个盘 子,以此类推。
    	 * 
    	 * @param tonN
    	 *            顶部的盘子
    	 * @param from
    	 *            源塔座(顶部盘子的起点) A
    	 * @param inner
    	 *            中介塔座(中介作用) B
    	 * @param to
    	 *            目标塔座(顶部盘子的终点) C
    	 */
    	public static void doTowers(int tonN, char from, char inner, char to) {
    		// 如果只有一块盘子,直接移动过去就可以了
    		if (tonN == 1)
    			System.out.println("Disk 1 from " + from + " to " + to); // A C
    		else {
    			// 否则的话 就先把 n-1块移动到中间
    			doTowers(tonN - 1, from, to, inner);// from > inner A B
    			// 然后把最后
    			System.out.println("Disk " + tonN + " from " + from + " to " + to);
    			// 把中间的一块移动到to
    			doTowers(tonN - 1, inner, from, to);//
    		}
    	}
    
    	public static void doTorwers2(int number, char from, char center, char to) {
    		// 假如是一块盘子的话,直接从A移动到C处
    		if (number == 1)
    			System.out.println("Disk 1 " + from + " to" + to);//  A --->C
    		else {
    			doTorwers2(number - 1, from, to, center);// A--->B
    
    			System.out.println("Disk " + number + "from " + from + "to" + to);
    
    			doTorwers2(number - 1, center, from, to);//B--->C
    
    		}
    
    	}
    	
    	public static void doTowers3(int number,char from,char center,char to){
    		if(number==1)
    			System.out.println("Disk 1 "+from+" to "+to); //A-C
    		else{
    			doTowers3(number-1, from, to,center );//A-B
    			System.out.println("Disk "+from+" to "+center);
    			doTowers3(number-1, center, from, to);//B-C
    		}
    	}
    	
    	
    	
    	
    	
    	
    	
    
    }
    
  • 相关阅读:
    算法 在连续线性空间里查找
    OSI网络模型和网络连接设备
    CPU 架构SMP/NUMA,调优
    cluster集群基本概念
    protocol buffers 使用方法
    Qt在window下的环境变量PATH的配置
    mysql connector c++ 1.1 API初步体验
    mysql connector c++ 1.1 安装
    python知识点总结01(不定时更新)
    ant-design表单自定义验证
  • 原文地址:https://www.cnblogs.com/qxlxi/p/12860917.html
Copyright © 2011-2022 走看看