汉诺塔求解

原创 2015年07月09日 14:49:42

这两天突然对递归有了兴趣,于是把以前没怎么弄明白的八皇后和汉诺塔一起过了过。觉得八皇后逻辑上挺好理解,抽象成程序语言写出来后也挺好解读,但汉诺塔的逻辑抽象成程序语言写出来后我觉得还是不怎么好理解。

汉诺塔的解题逻辑不难,跟普通递归没啥区别:(1)将所有n个盘抽象为第n盘和所有n-1盘:为了将第n盘从A移动到C,需要先把所有n-1盘移动到B,再将n移动到C,再将B上的所有n-1盘移动到C。

移动第n盘解决了,那么问题就到了如何把所有n-1盘从B移动到C,继续套用上一步骤的逻辑:(2)将所有n-1盘抽象为第n-1盘和所有n-2盘,为了将第n-1盘从B移动到C,需要先把所有n-2盘从B移动到A暂存,再将第n-1盘从B移动到C,再将A上的所有n-2盘移动到C。咦,到了这一步有没有发现规律?对,此时问题又回到了如何将所有n-2盘从A移动C,是不是又回到了(1)的逻辑!于是反复进行这2种逻辑即可,直到n == 1时直接将第1盘从A移动到C。

逻辑挺清楚,但程序写出来我不能把每一层递归中的每条语句作用解读出来。不像八皇后,每条语句我都知道它其实是暴利对比从行到列一个个试着填1然后比较,不符合则回退找同行下一列的目标。而汉诺塔,设n = 3时,第一层循环时可以理解为将剩下的2个盘从A移动到B(借助C);那么第二层循环中haino(n - 1, a, c, b)完成的是什么状态呢?暂时没想明白此时此语句对应什么样的状态。虽然程序没几句,根据逻辑大概也能理解,但当一句句从递归的具体场景来分析时,我觉得还是有难度的。以此做个记录。

void haino(int n, char a, char b, char c) {
    static int indexhaino = 1;
    if (n == 1) {
        printf("%d-->No.%d-->from %c to %c\n", indexhaino, n, a, c);
    }
    else {
        haino(n - 1, a, c, b);
        indexhaino++;
        printf("%d-->No.%d-->from %c to %c\n", indexhaino, n, a, c);
        indexhaino++;
        haino(n - 1, b, a, c);
    }
}


汉诺塔递归及非递归解法

1. 经典递归解法 #include void mov(char a, char b) { std::cout "
  • lyingson
  • lyingson
  • 2015年10月05日 16:14
  • 383

分治算法--汉诺塔问题

一、问题描述 1.有三根杆子A,B,C。A杆上有若干碟子 2.每次移动一块碟子,小的只能叠在大的上面 3.把所有碟子从A杆全部移到C杆上二、问题分析 将A盘中的若干个盘子分为两部分,下面一个,...
  • ydx115600497
  • ydx115600497
  • 2016年11月15日 16:47
  • 453

杭电 汉诺塔问题总结

看了一下杭电的各种汉诺塔问题,遇到些奇奇葩葩的小问题,也有很多很好的思想,比如最后一题,想了半天都不是a[n]*m,后来向hr_whisper讨教了番,那种头正尾反以及尾正头反的颠倒方法还真是想不到,...
  • xueerfei008
  • xueerfei008
  • 2013年08月16日 22:07
  • 5185

汉诺塔层数大于10时输出不正常的分析及时间复杂度

使用递归方式解决汉诺塔问题,具体思路就不详细叙述了,代码如下: #include using namespace std; int i; void moveDisk(int diskNum,...
  • mumuriyue
  • mumuriyue
  • 2016年06月04日 23:56
  • 1142

双层汉诺塔、八皇后等问题

搜索有以下几种算法: 枚举算法: 也即列举问题的所有状态从而寻找符合问题的解的方法。适合用于状态较少,比较简单的问题上。 广度优先搜索: 从初始点开始,根据规则展开第一层节点,并检...
  • u012386004
  • u012386004
  • 2013年11月12日 17:45
  • 1775

用递归法:设计算法求解汉诺塔问题,并编程实现。 (1) Hanoi(汉诺)塔问题分析 这是一个古典的数学问题,是一个用递归方法解题的典型例子。问题是这样的:古代有一个梵塔,塔内有3个座 A,B,C

用 递归法:设计算法求解汉诺塔问题,并编程实现。 (1) Hanoi(汉诺)塔问题分析 这是一个古典的数学问题,是一个用递归方法解题的典型例子。问题是这样的:古代有一个梵塔,塔内有3个座 A,B,...
  • u011329762
  • u011329762
  • 2014年11月11日 18:31
  • 7186

从递归算法思想解析汉诺塔问题

汉诺塔 - 问题起源 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到...
  • jespere_ling
  • jespere_ling
  • 2015年09月22日 17:52
  • 2565

"汉诺塔"算法-之通俗易懂,简单的原理-java编程

1.汉诺塔 2.三步曲 3.递归
  • nzfxx
  • nzfxx
  • 2016年06月04日 14:22
  • 5767

c语言经典问题:汉诺塔 Hanoi问题

这个问题使用递归思想是比较靠谱的,如果
  • zyb050607
  • zyb050607
  • 2014年06月24日 17:01
  • 1992

用栈模拟汉诺塔问题

在经典的汉诺塔问题中,有 3 个塔和 N 个可用来堆砌成塔的不同大小的盘子。要求盘子必须按照从小到大的顺序从上往下堆 (如,任意一个盘子,其必须堆在比它大的盘子上面)。同时,你必须满足以下限制条件: ...
  • chriscute
  • chriscute
  • 2016年11月29日 20:19
  • 667
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:汉诺塔求解
举报原因:
原因补充:

(最多只允许输入30个字)