`
xiao1zhao2
  • 浏览: 40425 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

浅谈递归算法之汉诺塔

阅读更多



 递归算法就是一个函数通过不断对自己的调用而求得最终结果的一种思维巧妙的算法.无论在哪种语言里,汉诺塔都是递归算法的经典题目.

 

1.题目简介

有三根相邻的柱子,左边的柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到右边的柱子上,并且每次移动同一根柱子上都不能出现大的盘子在小的盘子上方.

 

2.逻辑分析

假设我们有一个方法move(n)已经实现n个盘子的移动,当我们想再实现n+1个盘子的移动时,该怎么做呢?
>>首先调用move(n),将n个盘子从左边移动到中间的柱子;
>>然后将第n+1个盘子从左边移动到右边的柱子;
>>最后调用move(n),将n个盘子从中间再移动到右边的柱子,即可完成.
按照上面三个步骤,我们可以一直向前推导,直到只有一个盘子时,我们将它移动到正确的位置即可.注意,我们在每次调用move(n)方法时用到的"柱子"的并不一样,因此move(n)方法还应该有两个参数:src柱子和dest柱子.

 

3.代码实现
public class Hanoi {
	static int count = 0;

	public void move(Column src, Column dest, int number) {
		count++;

		if (number > 1) {
			Column transit = Column.values()[3 - src.ordinal() - dest.ordinal()];
			int frontnumber = number - 1;
			this.move(src, transit, frontnumber);
			System.out.println(number + "号盘子从\t " + src + "\t移动到\t" + dest);
			this.move(transit, dest, frontnumber);
		} else {
			System.out.println(1 + "号盘子从\t " + src + "\t移动到\t" + dest);
		}
	}

	public static void main(String[] args) {

		new Hanoi().move(Column.LEFT, Column.RIGHT, 3);
		System.out.println("操作已完成,一共操作了" + count + "次.");
	}

}

enum Column {
	LEFT, MIDDLE, RIGHT
}

 

执行结果:
1号盘子从  LEFT 移动到 RIGHT
2号盘子从  LEFT 移动到 MIDDLE
1号盘子从  RIGHT 移动到 MIDDLE
3号盘子从  LEFT 移动到 RIGHT
1号盘子从  MIDDLE 移动到 LEFT
2号盘子从  MIDDLE 移动到 RIGHT
1号盘子从  LEFT 移动到 RIGHT
操作已完成,一共操作了7次.

  • 大小: 17 KB
0
0
分享到:
评论

相关推荐

    2-2 递归算法之汉诺塔问题.pptx

    递归算法的汉诺塔问题实现ppt,较详细得解释了递归算法的使用以及如何用递归算法来解决汉诺塔问题,QAQ

    汉诺塔的递归算法 C++

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

    C++递归算法(汉诺塔问题)

    C++递归算法(汉诺塔问题)

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

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

    c++递归实现汉诺塔问题

    汉诺塔问题是一个经典的计算机科学问题,源自印度的古老传说,它涉及到三个柱子和一堆大小...以上就是关于“C++递归实现汉诺塔问题”的详细解析,它涵盖了递归算法设计的基本概念、实例代码以及相关的计算机科学知识。

    汉诺塔图形解法(递归算法)

    汉诺塔图形解法(递归算法) 汉诺塔图形解法是利用递归算法来解决汉诺塔问题的一个经典示例。汉诺塔问题是指将一个由多个不同的圆盘组成的柱子从一个柱子移至另一个柱子,而圆盘的大小各不相同,且大的圆盘不能放在...

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

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

    汉诺塔问题的非递归算法

    在理解并应用非递归算法解决汉诺塔问题的过程中,我们能够体会到算法设计的精妙,以及通过逻辑思维和策略规划来解决复杂问题的重要性。这种策略在现代编程和软件工程中尤为常见,很多情况下,一个复杂的问题可以通过...

    用栈实现汉诺塔的非递归算法c++

    我用vc编了一个用栈实现汉诺塔的非递归程序。可以运行的,里面代码作了说明的!

    C++基于递归算法解决汉诺塔问题与树的遍历功能示例

    本文实例讲述了C++基于递归算法解决汉诺塔问题与树的遍历功能。分享给大家供大家参考,具体如下: 递归是把问题转化为规模缩小的同类问题,然后迭代调用函数(或过程)求得问题的解。递归函数就是直接或间接调用自身...

    汉诺塔问题的非递归算法分析.doc

    汉诺塔问题的非递归算法分析 汉诺塔问题是计算机科学中一个经典的问题,旨在研究如何将盘子从一个塔柱移到另一个塔柱上,并保持盘子的大小顺序不变。该问题可以被描述为:有三个塔柱A、B和C,开始时A柱上有n个盘子...

    汉诺塔的递归算法 C语言

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

    递归实现:汉诺塔问题

    汉诺塔问题通过递归算法来解决是一种非常直观且有效的方法。递归的基本思想是将大问题分解为小问题,最终达到可以直接求解的程度。 在这个程序中,`move` 函数负责实际的移动操作,其参数如下: - `m` 表示当前需要...

    汉诺塔递归与非递归两种算法的代码与结果对比

    在你提供的文件中,"递归13.txt"可能包含了使用递归算法解决13个盘子的汉诺塔问题的代码。递归算法通常使用函数调用自身,形成一个树状结构,最终达到目标状态。 **非递归算法** 非递归算法,也称为迭代算法,通过...

    汉诺塔问题的递归算法,很简单哦

    通过学习汉诺塔问题,我们不仅可以掌握递归算法,还能理解分治策略、递归树和回溯法等概念。这个经典问题对于学习计算机科学和算法设计是非常有价值的。在实际编程中,递归算法常用于解决各种问题,如树的遍历、图的...

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

    在提供的压缩包中,"汉诺塔非递归算法.doc"可能包含了详细的文字说明,解释了算法的思路和步骤,而"汉诺塔非递归算法.cpp"则是实际的C++源代码,你可以查看并运行这个程序来观察非递归算法如何解决汉诺塔问题。...

    c语言汉诺塔的递归算法

    汉诺塔游戏是一种经典的逻辑问题,它通过递归算法来解决。在这个游戏中,有三个柱子,分别标记为A、B、C,A柱上从下到上按大小顺序叠放着n个圆盘。目标是将所有圆盘从柱子A移动到柱子C,但每次只能移动一个圆盘,...

    汉诺塔非递归算法

    递归算法通常是解决汉诺塔问题的常见方法,但这里我们要讨论的是非递归算法。 非递归算法通常基于迭代或堆栈的思想来实现。在武汉大学的算法描述中,可能会使用一种称为"栈模拟"的方法,这种方法可以有效地避免递归...

    用递归写的汉诺塔小程序

    本程序通过递归算法实现汉诺塔的解决方案,非常适合那些想要理解递归概念的人学习。 递归是编程中的一个重要概念,它是指在函数或方法内部调用自身的过程。在解决汉诺塔问题时,递归非常适用,因为问题可以通过解决...

    汉诺塔问题递归算法

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

Global site tag (gtag.js) - Google Analytics