c语言递归解决汉诺塔参数变化的疑惑

答案:3  信息版本:手机版

解决时间 2020-04-05 14:20

已解决

2020-04-05 10:49

#include void main()

{void hanoi(int n,char one,char two,char three);

int m;

printf("input the number of disks:");

scanf("%d",&m);

printf("the step to moving %d disks:\n",m);

hanoi(m,'A','B','C');

}

void hanoi(int n,char one,char two,char three)

{void move(char x,char y);

if (n==1) move(one,three);

else

{hanoi(n-1,one,three,two);

move(one,three);

hanoi(n-1,two,one,three);

}

}

void move(char x,char y)

{

printf("%c-->%c\n",x,y);

}

谭浩强的书上的程序,我知道一步步的调用顺序,明白算法,但我不知道怎么实现的,就是在每一次调用hannuota时,one two three所对应的字母不理解,忘给我解释一下,最好把每一次调用h函数及move函数的 one two three的对应值写出,谢谢!

全部回答

1楼

2020-04-05 13:22

你要倒着想这个问题的顺序。要解决汉诺塔问题,就要从地基开始考虑。电脑解决的思路是假设最后一步是这样的:最小的一片在a柱子上,其他的片排好了在c柱子上。那么这时,问题就可以变成把最小的一片挪到c柱子就完结了。那么往前反推,怎样能造成最后一步这样的场景?

我们这里假设有n片需要移到c柱子上去。如果能把最大的一片按规则移到c柱子,那一片就变成了我们不用考虑的地基,以后任何的移动都与他无关,然后再考虑剩下的n-1片,那么问题的规模就会逐步缩小,逐渐缩小到电脑假设的最后一步。那么什么情况下当前最大的一片可以移到c上呢?就是当其他比他小的n-1片都在b上了,他才能顺利移到c上。这就是电脑解汉诺塔的基本思路,类似于逆推法。如果你理解了电脑解答这个问题的基本思路,就能理解这个算法了。

回到你的具体问题。n=3。有3片需要移动,从小到大编号为1、2、3,柱子分别为one(a),two(b),three(c),则步骤如下:

1. 为了使3号片顺利到c,那么前提是1、2号片顺利到b。

2. 1、2号到b,前提是2顺利到b

3. 2顺利到b,前提是1到c

4. 1可以成功到c,此时逆推过程,得解答

2楼

2020-04-05 12:55

这种实现方法是递归的方法来是实现的,递归的实现离不开栈。首先第一个主函数调用

hanoi(m,'A','B','C');(把A中的m个盘子利用B移动到C)在这个函数体内他由调移到hanoi(n-1,‘A’,‘C’,‘B’);(把A的前n-1个盘子利用C移到B)此时hanoi(m,'A','B','C');在cpu中的环境入栈,hanoi(n-1,‘A’,‘C’,‘B’);的各个环境参数进驻cpu而他又调用hanoi(n-3,,‘A’,‘B,‘C);依次类推....直到第一个参数n==1为止就把A上的最后一个盘子移到另一个柱子上,然后返回...最后hanoi(n-1,‘A’,‘C’,‘B’)函数返回,执行move(’A‘,'C‘);把A移动到C上。再执行hanoi(n-1,‘B,‘A,‘C);他的执行步骤和hanoi(n-1,‘A’,‘C’,‘B’)一样,就不在解释

3楼

2020-04-05 11:31

汉诺塔问题是非常经典的递归问题,可以这么讲,真正领会递归不是一两天的事情。然而递归又是算法的基础,你必须掌握。

其实只要抓住两点

1、递归体(递归到底要实现什么)

2、递归出口(任何递归都有一个出口)

好了现在来看这个问题

A B C

ABC三堆,将A堆盘子通过B堆过渡,送到C堆,要求每一次送的时候大盘子在下面

此题的递归思想:将A堆中上面的n-1(假设n个)个盘子送到B堆上,再把A堆中最大的盘子

送到C堆上,最后将B堆中n-1个盘子送到C堆上就OK啦

上面的就是递归体,而递归的出口在哪里呢?显然当n=1时这个就是递归的出口

下面来看你的程序

one--------A堆

two---------B堆

three-------C堆

#include void main()

{void hanoi(int n,char one,char two,char three);

int m;

printf("input the number of disks:");

scanf("%d",&m);

printf("the step to moving %d disks:\n",m);

hanoi(m,'A','B','C');

}

void hanoi(int n,char one,char two,char three)

{void move(char x,char y);

if (n==1) move(one,three);//只有一个盘子的时候直接送到C堆上

else

{hanoi(n-1,one,three,two);//不值一个盘子时候,将A上面的n-1个盘子通过C堆送到B堆上

move(one,three);//上面送完了之后,将A堆中最大盘送到C堆上

hanoi(n-1,two,one,three);//最后将B堆送到C堆上完毕(通过A过渡)

}//上面的三句话就是递归体,至于他的过程你是无法跟中的,但是思想是很明确的

}

void move(char x,char y)

{

printf("%c-->%c\n",x,y);

}

PS:那些字符只是个标记而已,不要迷惑他们。。。

我要举报

如果感觉以上信息为低俗/不良/侵权的信息,可以点下面链接进行举报,我们会做出相应处理,感谢你的支持!

大家都在看

推荐资讯

c语言递归汉诺塔次数,c语言递归解决汉诺塔参数变化的疑惑相关推荐

  1. c语言 统计数量用count_c语言中统计重复数字次数 c语言问题 统计不同数字的个数...

    请问c语言当中,如何统计数字各自出现的次数 请教一个问题: 在c语言当中,用数组的方法,统计输入的一串数字,统计实现代码: #include int main() { int num = 0, i = ...

  2. c语言求寻找假币的次数,C语言经典算法 - 八枚银币问题

    C语言经典算法 - 八枚银币问题 说明现有八枚银币a b c d e f g h,已知其中一枚是假币,其重量不同于真币,但不知是较轻或 较重,如何使用天平以最少的比较次数,决定出哪枚是假币,并得知假币 ...

  3. c语言如何寻找排序最少次数,C语言快速排序比较次数问题

    满意答案 wtrjTcZ9 推荐于 2018.03.21 采纳率:55%    等级:7 已帮助:458人 你可以用冒泡排序法自己试一试 目的:按要求从大到小或从小到大排序. 基本思路:对尚未排序的各 ...

  4. c语言递归解决汉诺塔问题

    c语言递归解决汉诺塔问题 参考文章: (1)c语言递归解决汉诺塔问题 (2)https://www.cnblogs.com/didiaoxiaoguai/p/6686407.html 备忘一下.

  5. 【汉诺塔】C语言递归解法,深层次地带你理解汉诺塔公式

    目录 汉诺塔公式 汉诺塔问题在数学层面的公式: C语言递归公式 两层汉诺塔 三层汉诺塔 递归问题可谓是学习C语言以来的第一个拦路虎,而汉诺塔问题更是递归中对新手很不友好的一道经典题,我们接下来从公式角 ...

  6. 汉诺塔问题详解 递归实现 C语言

    目录 一.前言 二.游戏规则 三.思路讲解 四.完整代码 五.最终结果展示 一.前言 汉诺塔:汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,  其中一根柱子 ...

  7. 汉诺塔求次数(用递归)

    Copyright(c)2013,烟台大学计算机学院学生 *All rights reserved. *文件名称:汉诺塔求次数(用递归) *作者:杨飞 *完成日期:2013年11月25日 *版本号:v ...

  8. 用递归与非递归方法实现汉诺塔问题,C语言实现

    如题,直接上代码,注释写的很全了 非递归还是用栈实现 /*包含头文件*/ #include <stdio.h> #define MAXSIZE 60 /*函数声明*/ void Hanoi ...

  9. hanoi塔(汉诺塔)--C语言

    hanoi塔(汉诺塔)–C语言 一.什么是hanoi塔 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具. 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄 ...

最新文章

  1. Linux中的进程之初步了解
  2. seaborn使用violinplot函数可视化小提琴图、使用swarmplot函数添加抖动数据点(jittered points)显示数据的稠密程度
  3. 《LeetCode力扣练习》第8题 C语言版 (做出来就行,别问我效率。。。。)
  4. openstack mysql 故障_Openstack mysql自发连接错误2006,“mysql服务器已经离开
  5. 51单片机c语言程序控制,51单片机C语言编程基础及实例.pdf
  6. 传统的BIOS启动过程与UEFI启动过程
  7. GPS核心技术--精确计时与原子钟
  8. 软件界面布局调整推荐
  9. 线材下料优化python算法_python实现最优化算法
  10. mysql常用的开发软件下载_强烈推荐!14款经典的MySQL客户端软件
  11. PFC 3D 中存在的一个问题?
  12. java请假系统毕业设计_毕业设计学生管理请假系统.doc
  13. 微信小程序web-view 外部引用h5页面调用摄像头录制视频 配有提示音
  14. Mac安装激活 MATLAB R2018a
  15. 鹅厂流出两份Android Framework技术宝典火了,完整版 PDF 限时开放下载
  16. ios app 应用内购买配置完全指南
  17. 聚丙烯酸(PAA)修饰纳米Fe3O4四氧化三铁粒子|CNTs/Fe3O4/TiO2纳米复合材料(齐岳)
  18. 在ubuntu 上搭建Nginx-RTMP 直播服务器
  19. thinkphp5整合系列之汉字转拼音完美支持多音字
  20. 外汇交易的高风险行为应该如何防范?

热门文章

  1. 蚂蚁集团回应 “ IPO 推迟”;iPhone12系列支持北斗系统;LLVM 11.0.0 发布 | 极客头条
  2. 中小企业数智化转型,这个百万级客户市场差点被遗忘
  3. 如何仅用300行代码完成spring基本框架?
  4. Python2 圆满落幕,Python 继续辉煌! | 原力计划
  5. 2020 年,Android 还有哪些新期待?
  6. 为什么旧硬件的驱动越来越难找了?
  7. 科大讯飞交通超脑荣获 2019 年大数据应用最佳实践案例 TOP10
  8. 红旗Linux的“亚洲区块链操作系统”重装上阵!
  9. 京东回应收集隐私;“阿里离职女高管”遭怒怼;1.8 万安卓应用违反谷歌政策 | 极客头条...
  10. Android 免费模式将终结?