`
dapp66
  • 浏览: 24665 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

汉诺塔问题

阅读更多

因为自己基础比较差,所以想在工作之余自己再学学,巩固一下,磨刀不误砍柴工嘛。今天看到了汉诺塔(Hanoi)问题,就记录了下来。

首先,大家都知道Hanoi问题是利用递归来解决的,那么什么是递归呢?

递归就是将规模为n的问题,降解成若干个规模为n-1的问题,依次降解,直到问题规模可求,求出低阶规模的解,代入高阶问题中,直至求出规模为n的问题的解。递归包括回溯和递推两个过程。

递归方式写出的方法往往十分简介,但是也有不少缺点:递归算法的运行效率比较低。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。

 

我们假设有三根杆子from、middle、to。

首先,考虑from杆上只有一个盘子(这样是递归的终止条件),任务变成:
   *将from杆上的唯一一个盘子移到to杆上;
然后,考虑from杆最下面的一个盘子而非上面的一些盘子,于是任务变成了:
   *将上面的n-1个盘子移到middle杆上;
   *将from杆上剩下的盘子移到to杆上;
   *将middle杆上的全部盘子移到to杆上。
将这个过程继续下去,就是要先完成移动n-1个盘子、n-2个盘子、n-3个盘子....的工作。

用程序来表示:我们定义一个函数move(n,from,middle,to)。该函数的功能是将N个盘子从from杆上借助middle杆移动到to杆上。这样移动n个盘子的工作就可以按照以下过程进行:
      1) move(n-1,from,to,middle);
      2) 将一个盘子从from移动到to上;
      3) move(n-1,middle,from,to);
重复以上过程,直到将全部的盘子移动到位时为止。看看java源码:

 

public class Hanoi {    
	public static void main(String args[]) throws IOException {        
		int n;        
		BufferedReader buf;       
		buf = new BufferedReader(new InputStreamReader(System.in));        
		System.out.print("请输入盘数:");        
		n = Integer.parseInt(buf.readLine());        
		Hanoi hanoi = new Hanoi();        
		hanoi.move(n, 'A', 'B', 'C');    
	}    
	public void move(int n, char from, char middle, char to) {        
		if(n == 1)            
			System.out.println("盘 " + n + " 由 " + from + " 移至 " + to);    //1      
		else {            
			move(n - 1, from, to, middle);                                                  //2
			System.out.println("盘 " + n + " 由 " + from + " 移至 " + to);    //3        
			move(n - 1, middle, from, to);        						//4
		}    
	}
} 

在上面的代码中,解决问题的就是move方法,它使用了递归实现。其流程似乎很好理解。假设n=3,那么以上程序打印出来的就是:

 

请输入盘数:3

盘 1 由 A 移至 C

盘 2 由 A 移至 B

盘 1 由 C 移至 B

盘 3 由 A 移至 C

盘 1 由 B 移至 A

盘 2 由 B 移至 C

盘 1 由 A 移至 C

可是我想了半天,在自己的脑海里也模拟程序的运行,然后用笔写下运行的结果,却不知道怎么样才能得到以上的结果,看来还是没有彻底的理解递归的过程,Go on。

使用Eclipse的debug+单步执行 后发现在代码else块中实际执行顺序是:2-3-4-3-4-2-3-4。

 

 

 

 

1
0
分享到:
评论
1 楼 qinglangee 2010-01-30  
窦娥冤,窦娥

相关推荐

    汉诺塔问题matlab代码

    汉诺塔问题是一种经典的递归算法问题,源自印度的一个古老传说。在数学和计算机科学领域,它是用来教学和理解递归思想的一个经典实例。在MATLAB中实现汉诺塔问题,我们可以利用其强大的编程功能来解决这个问题。 ...

    汉诺塔问题算法以及实现

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

    汉诺塔问题演示 代码

    汉诺塔问题是一种经典的递归算法问题,源自印度的一个古老传说。它涉及到将一堆盘子从一根柱子移动到另一根柱子,遵循以下规则: 1. 任何时候,盘子必须保持在柱子上。 2. 一次只能移动一个盘子。 3. 盘子不能被比...

    用栈实现汉诺塔问题

    任意输入N个盘,在三个柱子上实现汉诺塔问题的非递归求解,用栈进行

    汉诺塔问题及变体

    在压缩包中的源代码文件,如`hanoi.cpp`可能包含了基础的汉诺塔问题的递归解决方案,而`hanoiParity.cpp`可能实现了奇偶汉诺塔问题的算法,`hanoiNear.cpp`则可能针对邻近移动汉诺塔问题进行了实现,`hanoiCircle....

    用汇编语言实现汉诺塔问题

    汇编语言中用递归算法实现汉诺塔问题。有X,Y,Z三个柱子和几个大小都不一样且能套进柱子的圆盘(编号为1,2,3,……,N),这N个圆盘已按由大到小的顺序依次套在X柱上,要求将这些圆盘按如下规则由X柱移到Z柱上。 ...

    状态空间法解决汉诺塔问题

    利用状态空间法对汉诺塔定义状态,用广度优先的方法解决汉诺塔问题,人工智能.(属于学校学习课程所做,非商业内容)

    解决汉诺塔问题的算法

    汉诺塔问题C/C++;解决汉诺塔问题的算法;递归

    汉诺塔问题vbbianch

    汉诺塔问题是一个经典的递归算法问题,源自印度古老传说,旨在通过移动一系列盘子从一个柱子到另一个柱子,遵循三个基本规则:每次只能移动一个盘子、大盘子不能放在小盘子上面,以及所有盘子必须从初始柱子移动到...

    汉诺塔问题的ppt

    汉诺塔问题

    Hanoi Tower 汉诺塔问题/c

    汉诺塔问题是一个经典的递归问题,在计算机科学和数学领域都有着广泛的应用。它不仅是一个编程练习题,也是理解递归思想和分治策略的一个很好例子。 首先,我们来了解汉诺塔问题的基本概念。汉诺塔(Hanoi Tower)...

    汉诺塔问题 C++

    汉诺塔问题是一个经典的递归问题,源自印度的古老传说,它涉及到将一系列圆盘从一根柱子移动到另一根柱子,同时遵循三个规则: 1. 每次只能移动一个圆盘。 2. 不允许较大的圆盘位于较小的圆盘之上。 3. 必须将所有...

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

    汉诺塔问题是一个经典的计算机科学问题,源自印度的古老传说,它涉及到三个柱子和一堆大小不一的圆盘。目标是将所有圆盘从一个柱子(称为起始柱)移动到另一个柱子(称为目标柱),同时遵循以下三个规则: 1. 每次...

    c语言求解汉诺塔问题

    汉诺塔问题是一个经典的计算机科学问题,源自印度的古老传说,它涉及到将一系列盘子从一根柱子移动到另一根柱子,遵循特定的规则。在这个问题中,有三根柱子(通常标记为A、B和C)和一些大小不一的盘子,每个盘子都...

    汉诺塔问题的详细讲解以及实现代码

    汉诺塔问题是一个经典的递归问题,源自印度的古老传说,它涉及到三个柱子和一组大小不一的圆盘。目标是将所有圆盘从一个柱子(称为起始柱)移动到另一个柱子(目标柱),同时遵循以下规则: 1. 任何时候,较大的...

    汉诺塔问题的拓展 四柱汉诺塔

    算法分析设计中三柱汉诺塔算法的拓展,四柱汉诺塔的设计算法代码

    程序设计中的经典——汉诺塔问题

    汉诺塔问题是一个经典的递归问题,源自印度的古老传说,它涉及到在三个柱子(A、B、C)之间移动一系列盘子,遵循以下规则: 1. **基本规则**:每次只能移动一个盘子。 2. **顺序规则**:任何时候较大的盘子都不能...

    汉诺塔问题的简单程序

    汉诺塔问题是一个经典的计算机科学问题,源自印度的古老传说,它涉及到三个柱子和一组盘子,每个盘子大小不一。问题的目标是将所有盘子从初始柱子(通常称为A柱)移动到目标柱子(C柱),遵循以下规则: 1. 每次...

Global site tag (gtag.js) - Google Analytics