汉诺塔算法的理解

当盘子数为两个时,移动图如下:

移动规律为:

步骤 盘子编号 源柱子 目标柱子
1 1 A B
2 2 A C
3 1 B C

当盘子数为3个时:

移动规律为:

步骤 盘子编号 源柱子 目标柱子
1 1 A C
2 2 A B
3 1 C B
4 3 A C
5 1 B A
6 2 B C
7 1 A C

从以上移动移动规律可以总结出,当步骤序号和盘子数目相同时,就是把最底下的盘子从A移动到C,其它的步骤都是对等的,规律如下:

  1. 中间以上动作是:源柱子(A)不变,目标柱子为C,辅助柱子为B进行移动,也就是

    源柱子->目标柱子

    源柱子->辅助柱子

    目标柱子->辅助柱子

  2. 中间动作:从A到C也就是从源柱子到目标柱子
  3. 中间以下动作:源柱子是B,目标柱子为C,辅助柱子为A进行移动,也就是

    源柱子->辅助柱子

    源柱子->目标柱子

    辅助柱子->目标柱子

按照以上规律,可以大概总结出实际上移动的主要动作实际上就是在重复三步动作,用java代码可以表示如下:

/**
 * @author lenovo
 *
 */
public class Hanoi {
    /**
    * 
    * @param n 盘子的数目
    * @param origin 源座
    * @param assist 辅助座
    * @param destination 目的座
    */
    public void hanoi(int n, char origin, char assist, char destination) {
    	if (n >= 1) {
    		hanoi(n - 1, origin, destination, assist);
    		System.out.println("Direction:" + origin + "--->" + destination);
    		hanoi(n - 1, assist, origin, destination);
    	}
    }
 
    public static void main(String[] args) {
        Hanoi hanoi = new Hanoi();
        hanoi.hanoi(3, ‘A‘, ‘B‘, ‘C‘);
    }
}

一开始我理解这个算法的时候老是一直在分析程序的出栈,入栈动作,后面看了这篇文章汉诺塔的递归算法与解析才有点恍然大悟,这个算法实际上是考验对递归思想的理解:总结事物的规律,然后再用程序表达出来。

时间: 2024-10-04 04:44:47

汉诺塔算法的理解的相关文章

汉诺塔算法演示1.0

工作之余闲来无聊,于是就有了用JS来实现算法演示的想法,很久以前用JS实现过选择排序,不过源程序找不到了! 汉诺塔的递归算法: void move(int n,char a,char b,char c) { if(n==1) printf("\t%c->%c\n",a,c); //当n只有1个的时候直接从a移动到c else { move(n-1,a,c,b); //第n-1个要从a通过c移动到b printf("\t%c->%c\n",a,c); mo

基于Python的汉诺塔算法

首先贴出Python编写的汉诺塔算法的代码: def hanoti(n,x1,x2,x3):    if(n == 1):        print('move:',x1,'-->',x3)        return    hanoti(n-1,x1,x3,x2)    print('move:',x1,'-->',x3)    hanoti(n-1,x2,x1,x3) hanoti(3,'A','B','C') 汉诺塔问题归根结底就是一个循环问题,循环包括两大要素:循环体.循环结束条件 首

Java算法分析2—————几种排序&汉诺塔算法

一:插入排序 /* * 插入排序 */ /* * 原序列 [12] 15 9 20 6 31 24 * 第0趟 [12 15] 9 20 6 31 24 * 第1趟 [9 12 15] 20 6 31 24 * 第2趟 [9 12 15 20] 6 31 24 * 第3趟 [6 9 12 15 20] 31 24 * n个数,一共需要多少趟?n个数,n-1趟 * 第0趟,把1位置的数,和1位置之前的数进行比较,按大小顺序排列 * 第1趟,把2位置的数,和2位置之前的数进行比较,按大小顺序排列 .

20150410 递归实现汉诺塔算法

20150410 递归实现汉诺塔算法 2015-04-10 Lover雪儿 1 //汉诺塔 2 #include <stdio.h> 3 4 static int i = 0; 5 6 //将n个盘子从x借助y移动z 7 //n:移动的个数 x:源地址 y:中间柱子 z:目的柱子 8 void move(int n, char x, char y, char z) 9 { 10 if(1 == n){ 11 printf("第%d次移动 %c--->%c\n", ++

汉诺塔算法

首先介绍下汉诺塔: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘. 算法思想: 主要是递归方法的使用:假设有A.B.C三根柱子,用户输入盘子的数目,开始的时候盘子全部在A上,通过B将所有的盘子移动到C上. 盘子数目为n 1.当n=1时,直接将A上的盘子移到C上

【数据结构与算法】汉诺塔算法——java递归实现

汉诺塔的递归实现算法,将A中的圆盘借助B圆盘完全移动到C圆盘上, 每次只能移动一个圆盘,并且每次移动时大盘不能放在小盘上面 递归函数的伪算法为如下: if(n == 1)    直接将A柱子上的圆盘从A移动到C else    先将A柱子上的n-1个圆盘借助C柱子移动到B柱子上    直接将A柱子上的第n个圆盘移动到C柱子上    最后将B柱子上的n-1个圆盘借助A柱子移动到C柱子上 该递归算法的时间复杂度为O(2的n次方),当有n个圆盘时,需要移动圆盘2的n次方-1次 public class

汉诺塔算法之求解最佳步数

写的不好,但是请尊重版权,转载请注明出处: http://www.cnblogs.com/xiaovw/ 何为汉诺塔? 答:汉诺塔是根据一个传说形成的一个问题.汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘. 关于汉诺塔的经典问题: 有三根相邻的柱子,标号为A,

汉诺塔算法学习-C代码

#include <stdio.h> void main() {   extern a;   extern b;   extern c;   extern s;   void hanno(int,char,char,char);   void setNum(int);   int n;   printf("Please input the number of dishes: ");   scanf("%d",&n);   printf("

python 递归实现汉诺塔算法

def move(n,a,b,c): if (n == 1): print ( "第 ", n ," 步: 将盘子由 " ,a ," 移动到 " ,c) #return else: move(n-1,a,c,b) #首先需要把 (N-1) 个圆盘移动到 b print ("A==>b") move(1,a,b,c) #将a的最后一个圆盘移动到c move(n-1,b,a,c) #再将b的(N-1)个圆盘移动到c prin