规则:大盘子不能压在小盘子上。
要求:将A柱子上所有盘(每个盘大小不同)放到C柱子上,使用B柱子作辅助。

比如柱子A上有n个盘,执行以下步骤:
1. 把n-1个盘从源柱移动到临时柱上;
2. 把源柱上剩余的1个盘移动到目标柱上;
3. 把临时柱上的n-1个盘移到目标柱上。

显然,以上步骤将问题的规模缩小了一点。没有直接移动n个盘,而是移动n-1个盘。
那么,对于任务1和任务3来说,其性质显然和原问题是一样的,只是需要移动的盘子的数量减少了。
那么,对于任务1和任务3,可以用解决原问题的方法解决它们。这样不断重复下去,问题规模不断缩小,到最后变成了举手之劳,这样形成了递归模型。递归模型为hanio(int n, char source, char temp, char target)。num为当前任务需要移动的盘子的个数,source, temp, target用于指定三种类型的柱子。

为了写出代码,拿任务1作具体演绎:
1.1把n-1个盘从源柱移动到临时柱上;
  2.1把n-2个盘从源柱移动到临时柱上;
    3.1把n-3个盘从源柱移动到临时柱上;
      …
    3.2把源柱上剩余的1个盘移动到目标柱上;
    3.3把临时柱上的n-3个盘移到目标柱上。
  2.2把源柱上剩余的1个盘移动到目标柱上;
  2.3把临时柱上的n-2个盘移到目标柱上。
1.2把源柱上剩余的1个盘移动到目标柱上;
1.3把临时柱上的n-1个盘移到目标柱上。

移动是在两个位置之间移动,因此只需要两个参数。定义第一个参数位置始终为每个步骤的起点,第三个参数位置始终为每个步骤的终点。变量source, temp, target的初值分别为'A', 'B', 'C'。
递归的终点是:把1个盘从源柱移动到目标柱上。

void hanio(int n, char source, char temp, char target)
{
if(n == )//递归的终点
move(source, target);
else{
//下面的代码是对文章开头步骤的复述
hanio(n-, source, target, temp);
move(source, target);
hanio(n-, temp, source, target);
}
}

完整代码如下:

#include <stdio.h>
void hanio(int n, char source, char temp, char target);
void move(char x, char y); int main()
{
int num = ;
hanio(num, 'A', 'B', 'C');
return ;
}
void hanio(int n, char source, char temp, char target)
{
if(n == )//递归的终点
move(source, target);
else{
//下面的代码是对文章开头步骤的复述
hanio(n-, source, target, temp);
move(source, target);
hanio(n-, temp, source, target);
}
} void move(char x, char y)
{
printf("%c--->%c\n", x, y);
}

不建议继续作微观思考,显然模型已经构造完毕。如果非要深入演绎,此处可以举个例子。
从上往下看,先看第一个任务:把n-1个盘从源柱移动到临时柱上。
这个任务重新表述为:把n-1个盘从源柱A移动到临时柱B上。
由于要达成把n-1个盘从源柱移动到临时柱B上这个目标,原问题中的临时柱B显然已经成为了本任务中的目标柱,而C柱本来在原问题中是目标柱,现在在这个任务中也就成了临时柱,源柱是A柱。
这里B和C发生了交换。A--源柱,B--目标柱,C--临时柱。

为了完成第一个任务,先要完成第二个任务:把n-2个盘从源柱移动到临时柱上。

我们来看第二个任务。
这个任务重新表述为:把n-2个盘从源柱A移动到临时柱C上。
在这个任务中,C柱俨然是目标柱,而B柱只好是临时柱了。
A--源柱,B---临时柱,C-目标柱。
这里,B和C又发生了交换,角色换回来了,和原问题的各柱扮演的角色一样,这样不断交换下去。
不信看第三个任务:把n-3个盘从源柱移动到临时柱上。
这个任务重新表述为:把n-2个盘从源柱A移动到临时柱B上。
那么B又成了目标柱。。。

汉诺(hanio)塔问题的更多相关文章

  1. ACM1997_汉诺栽塔VII

    #include <stdio.h> #include <iostream> #include <queue> #include <stdlib.h> ...

  2. 汉诺塔(Hanoi)——小小算法

    传送门: 袁咩咩的小小博客 汉诺(Hanoi)塔源于古印度,是非常著名的智力趣题,大意如下: 勃拉玛是古印度的一个开天辟地的神,其在一个庙宇中留下了三根金刚石的棒,第一 根上面套着64个大小不一的圆形 ...

  3. Hanio汉诺塔代码递归实现

    1.背景介绍 Hanio (汉诺塔,又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘 ...

  4. JS经典面试题汉诺塔

    我爱撸码,撸码使我感到快乐!大家好我是Counter.今天给大家分享的是利用JS将汉诺塔原理实现出来,其实主要是考察一个递归的思想,复杂的问题简单化,汉诺塔应该都知道吧,具体的游戏规则,可以百度查查, ...

  5. 汉诺塔问题-递归实现-JAVA

    public class hanio { /** * @param args */ public static void main(String[] args) { // TODO Auto-gene ...

  6. Python汉诺塔问题递归算法与程序

    汉诺塔问题: 问题来源:汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从上往下从小到大顺序摞着64片黄金圆盘.上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱 ...

  7. java实现组合数_n!_杨辉三角_组合数递推公式_回文数_汉诺塔问题

    一,使用计算机计算组合数 1,设计思想 (1)使用组合数公式利用n!来计算Cn^k=n!/k!(n-k)!用递推计算阶乘 (2)使用递推的方法用杨辉三角计算Cn+1^k=Cn^k-1+Cn^k 通过数 ...

  8. JAVA——汉诺塔

    大家还记得某年春晚小品那个把大象放冰箱需要几步吗? 今天,我准备写的是汉诺塔,有三个魔法石柱,分别:诚实.勇敢.正直.其中有一个石柱上从大到小,从地向上依次排放着四个魔法圆环,需要将那四个魔法圆环分别 ...

  9. js 递归 汉诺塔的例子

    程序调用自身的编程技巧称为递归. //汉诺塔的游戏,n为圆盘编号数量,编号,a,b,c代表的是三个柱子 var hanio=function(n,a,b,c){     if(n>0){    ...

  10. 图解汉诺塔问题( Java 递归实现)

    汉诺塔简介 最近在看数据结构和算法,遇到了一个非常有意思的问题--汉诺塔问题. 先看下百度百科是怎么定义汉诺塔的规则的: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候 ...

随机推荐

  1. 『计算机视觉』imgaug图像增强库中部分API简介

    https://github.com/aleju/imgaug 介绍一下官方demo中用到的几个变换,工程README.md已经给出了API简介,个人觉得不好理解,特此单独记录一下: import n ...

  2. Python3和HTMLTestRunner生成html测试报告

    1.测试环境: Python3.5+unittest+HTMLTestRunner 2.下载HTMLTestRunner.py文件 下载地址 http://tungwaiyip.info/softwa ...

  3. 如何检查linux服务器是否被入侵

    被入侵服务器的症状 当服务器被没有经验攻击者或者自动攻击程序入侵了的话,他们往往会消耗 100% 的资源.他们可能消耗 CPU 资源来进行数字货币的采矿或者发送垃圾邮件,也可能消耗带宽来发动 DoS ...

  4. 【Android】【问题解决记录】Error obtaining UI hierarchy :Error while obtaining UI hierarchy XML file: com.android.ddmlib.SyncException: Remote object doesn't exist!

    在使用uiautomatorviewer时遇到两类Error obtaining UI hierarchy报错,分别是: Error while obtaining UI hierarchy XML ...

  5. 一探istio-proxy(envoy)容器里的秘密

    今天,在测试环境跑通了istio. 惭愧,是用MicroK8s跑的,其它环境,不敢呀. 基本功能都OK了. 在运行了istio-injection=enabled之后,每个pod运行时,会多一个ist ...

  6. POJ 3694Network(Tarjan边双联通分量 + 缩点 + LCA并查集维护)

    [题意]: 有N个结点M条边的图,有Q次操作,每次操作在点x, y之间加一条边,加完E(x, y)后还有几个桥(割边),每次操作会累积,影响下一次操作. [思路]: 先用Tarjan求出一开始总的桥的 ...

  7. 25-C#笔记-文件的输入输出

    1. 写txt FileStream F = new FileStream("sample.txt", FileMode.Open, FileAccess.Read, FileSh ...

  8. 09-cmake语法-add_dependencies()

    在编译器的命令行上,为当前路径以及下层路径的源文件加入一些define flag.这个命令可以用来引入任何flag,但是它的原意是用来引入预处理器的定义.那些以-D或/D开头的.看起来像预处理器定义的 ...

  9. 平台级 SAAS 架构的基础:统一身份管理系统

    https://my.oschina.net/bochs/blog/2248954 业内在用户统一身份认证及授权管理领域,主要关注 4 个方面:集中账号管理(Account).集中认证管理(Authe ...

  10. PostgreSQL 11 Partitioning Improvements

    转自:https://pgdash.io/blog/partition-postgres-11.html PostgreSQL 11, due to be released later this ye ...