`
fiay1991
  • 浏览: 1581 次
社区版块
存档分类
最新评论

【Fiay】【Java】汉诺塔算法 递归实现

阅读更多

 

/**
 * 汉诺塔问题
 * 
 * 精确计算出到底需要移动多少次才能够将汉诺塔从柱子A搬到柱子B(柱子C作缓冲)
 * 输入:汉诺塔的层次数
 * 输出:移动次数和移动动作
 * 思路:递归
 * 使用:直接在main函数new Test(汉诺塔的层次数)
 * 
 * @author Fiay
 * 
 */
public class Test {
	private static String a = "柱子A";
	private static String b = "柱子B";
	private static String c = "柱子C";
	private int level;
	private int turns;
	/*省略Getter and Setter*/
	public Test(){}
	public Test(int level){
		this.level = level;
		this.turns = getTurnsByLevel(this.level);
		System.out.println("完成!\n共需要"+turns+"步");
	}
	
	public int getTurnsByLevel(int level){
		System.out.println("汉诺塔层次数为:"+level+"\n开始!");
		showSolution(level,a,b,c);
		return turns-1;
	}
	
	public void showSolution(int level,String a,String b,String c){
		if(level>0){
			showSolution(level-1,a,c,b);
			System.out.println(turns+" - 从("+a+")移到("+b+")\t");
			showSolution(level-1,c,b,a);
		}else{
			turns++;
		}
	}
	
	public static void main(String args[]){
		new Test(2);
		//new Test(3);
		//new Test(4);
	}
}
分享到:
评论
1 楼 fiay1991 2012-12-02  
汉诺塔次数计算公式,设层次数为x,操作次数为F(x),当层次为0时,操作次数为0,则有:
     
      F(0) = 0;

      F(1) = 2 * F(1-1) + 1 = 1;

      F(2) = 2 * F(2-1) + 1 = 2 * F(1) + 1 = 3;

      F(3) = 2 * F(3-1) + 1 = 2 * F(2) + 1 = 7;

      F(4) = 2 * F(4-1) + 1 = 2 * F(3) + 1 = 15;

      依此类推,可得: F(x) = 2 * F(x-1) + 1;

      又从1 3 7 15可看出,

      1 = 2^1 - 1;
     
      3 = 2^2 - 1;

      7 = 2^3 - 1;

      15 = 2^4 - 1;

      依此类推,可得:F(x) = 2^x - 1;

相关推荐

    汉诺塔的递归算法 C++

    用C++实现汉诺塔的递归算法,定义了类和方法。

    Java实现汉诺塔递归算法详解

    汉诺塔问题是一个经典的递归算法问题,它源自印度的一个古老传说,旨在通过演示如何将一组盘子从一根柱子移动到另一根柱子来解释宇宙的起源。在这个问题中,我们有三根柱子A、B和C,以及N个大小不一的盘子,初始时...

    汉诺塔非递归算法实验报告

    汉诺塔问题是一个经典的计算机科学问题,通常使用递归算法来解决。然而,这个实验报告提出了使用非递归算法来解决汉诺塔问题的方法。非递归算法的关键在于找到一个可重复执行的步骤序列,而不是像递归那样通过自我...

    汉诺塔的递归算法 C语言

    用C语言实现汉诺塔的递归算法,另外还有用栈来实现的方式:http://download.csdn.net/detail/jason19905/6419427

    C#汉诺塔非递归

    通过这种方法,我们不仅可以理解如何用非递归方式解决汉诺塔问题,还能深入学习栈数据结构的应用,以及如何利用C#编程语言实现这种算法。在实际编码中,可以参考提供的"汉诺塔最终版"文件,分析其代码逻辑,进一步...

    汉诺塔的非递归实现,c++

    总之,非递归的汉诺塔问题C++实现是一种创新的解决方案,它利用数据结构来避免递归调用的开销,展示了算法设计的灵活性和创造性。通过学习这种实现,你可以更深入地理解数据结构、算法以及它们在实际编程中的应用。

    汉诺塔非递归算法 数据结构

    以下是实现汉诺塔非递归算法的关键步骤: 1. **创建栈**:首先,我们需要三个栈,分别代表三个柱子A、B和C。初始时,所有盘子都在柱子A上,按大小顺序自顶向下排列。 2. **主循环**:对于每个盘子,我们将其从起始...

    汉诺塔问题递归算法

    汉诺塔问题的递归算法,附详细代码以及运行结果,有详细的算法描述。

    汉诺塔非递归算法

    C++源码实现非递归汉诺塔算法可能如下: ```cpp #include using namespace std; void moveDisk(int n, stack<int>& A, stack<int>& B, stack<int>& C) { for (int i = n; i > 0; i--) { A.push(i); } while ...

    汉诺塔非递归C语言实现.c

    适应于大学生学习算法

    汉诺塔问题算法以及实现

    ### 汉诺塔问题算法及其实现 #### 概述 汉诺塔问题是一个经典的递归算法案例,它不仅在计算机科学领域有着广泛的应用,同时也被用来教授递归思想的基础知识。这个问题最早由法国数学家Édouard Lucas于1883年提出,...

    汉诺塔非递归算法 用栈 C语言

    用栈来实现汉诺塔,要明白递归就是栈的重要应用之一,递归是系统自动调用栈来处理。

    汉诺塔实现算法

    //程序实现了mystack栈的声明和定义,并且通过函数 //move_stacks的递归调用和函数move_a_ring实现汉 //诺塔的算法,并用函数print_stacks和pr_chars实现汉诺 //塔的动画效果

    汉诺塔递归算法--C语言

    汉诺塔问题是一个经典的递归算法问题,它涉及到三个柱子(塔)和若干个大小不一的圆盘。在初始状态下,所有圆盘按照大小顺序堆叠在第一个柱子(1号塔)上,大的在下,小的在上。目标是将所有的圆盘从1号塔移动到2号...

    c语言汉诺塔的递归算法

    以下是一个C语言实现汉诺塔递归算法的基本框架: ```c #include void hanoi(int n, char from_rod, char inter_rod, char to_rod) { if (n >= 1) { // 将n-1个圆盘从初始柱移动到辅助柱 hanoi(n - 1, from_rod...

    汉诺塔非递归实现

    总的来说,这个非递归实现使用了状态跟踪和循环控制,避免了递归调用带来的额外开销,适合于理解和学习汉诺塔问题的另一种解决思路。这种方法虽然在代码复杂性上可能略高于递归解法,但在执行效率上可能会有优势,...

    c语言汉诺塔算法,递归,非递归

    汉诺塔问题的解决方案通常采用递归算法来实现,这是因为问题本身具有自然的递归性质。下面我们将详细探讨递归解法: **递归算法解释:** 假设我们有n个圆盘,我们可以按照以下步骤将它们从柱子A移动到柱子C,利用...

    汉诺塔问题非递归算法的实现

    ### 汉诺塔问题非递归算法的实现 #### 1. 汉诺塔问题概述 汉诺塔(Hanoi Tower)问题是一个经典的递归问题,在数学领域有着广泛的应用。该问题最初由法国数学家Édouard Lucas于1883年提出。汉诺塔问题涉及到三个...

    汉诺塔算法的递归与非递归的C以及C++源代码.doc

    汉诺塔算法的递归与非递归实现 汉诺塔算法是程序设计中的经典递归问题,来源于印度古老的传说。问题的描述是:有三根金刚石的棒,第一根上面套着 64 个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,...

    一个关于汉诺塔的非递归算法

    传统的汉诺塔解法通常采用递归算法,但本主题关注的是非递归算法的实现,这需要我们用循环和条件语句来代替递归调用。非递归算法可能会更利于理解,因为它们避免了递归可能导致的栈溢出问题,尤其在处理大量盘子时。...

Global site tag (gtag.js) - Google Analytics