汉诺塔C语言步骤解析
发布日期:2021-06-30 17:41:12
浏览次数:2
分类:技术文章
本文共 1166 字,大约阅读时间需要 3 分钟。
汉诺塔问题在C语言中一般采用递归法来写,假设有A、B、C三根棒,A棒放着若干个圆盘,将其移动到C棒上,中途可在B棒中暂时放置圆盘。
分析:
(1) 如果只有一个圆盘,则把该圆盘从A棒移动到C棒
(2) 如果圆盘数量n>1,移动圆盘的过程可分为如上图三部分
第一步: 将A棒上的n-1个圆盘移动到B棒上。 第二步: 将A棒上的一个圆盘移动到C棒上。 第三步: 将B棒上的n-1个圆盘移动到C棒上。其中,第一步和第三步又是移动多个圆盘的操作,又可重复上面的三个步骤来完成这两步中多个圆盘的移动,这样就构成了一个递归过程
根据以上分析,编写程序如下(这里方便编写用1,2,3表示):
#includevoid move(int n,int a,int b,int c) //n为圆盘个数,a移动到c,用b做临时棒{ if(n==1) printf("%d——>%d\n",a,c); else { move(n-1,a,c,b); //递归调用,移动a到b,用c做临时棒 printf("%d——>%d\n",a,c); move(n-1,b,a,c); //递归调用,将b移动到c,用a做临时棒 }}int main(){ int n; //圆盘个数 scanf("%d",&n); move(n,1,2,3); //1、2、3代表三个棒 return 0;}
分析代码:
我们需要重点注意,在定义的四个量中,除去定义圆盘的个数n,始终是从第一个变量向最后一个变量移动(不要因为字母的转换而混淆)当n=2时:
进入else条件内:此n-1=1;第一个语句:move(n-1,a,c,b);通过第一次递归,因为n=1,所以符合 if 条件,打印printf("%d——>%d\n",a,c); 注意 printf里面的c此时是b !!!即 1——>2第二个语句:printf("%d——>%d\n",a,c); 此时 :1——>3 (与上一条语句无关,可不要将b和c混淆)第三个语句:move(n-1,b,a,c); 进行第二次递归,因为n=1,所以符合 if 语句,打印printf("%d——>%d\n",a,c); 注意printf里面a此时是a !!!即2——>3
所以输入n=2时,打印出:
1——>2 1——>3 2——>3当n=3时:
此时n-1=2;所以可重复上面n=2的操作,进行多次递归时,最最需要注意的就是a,b,c位置的不断变化,只要记住一点,就是永远是打印第一个变量和最后一个变量(这两个量会不断变化,千万千万别混淆a,b,c。汉诺塔是经典的递归题,在了解与设计该问题时,不要忘记递归的思想,当然汉诺塔也有非递归的作法。。。。。。
转载地址:https://leo-max.blog.csdn.net/article/details/104681420 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2024年05月03日 21时03分50秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
AOP面向切面编程【图文教程】_第2章
2019-04-30
二叉树之前序、中序、后序和层次遍历【图文教程】
2019-04-30
java类的构成
2019-04-30
创建安装linux:centOS
2019-04-30
Xshell连接CentOS及安装hadoop的准备
2019-04-30
在linux上配置jdk和hadoop
2019-04-30
HDFS配置及常见命令
2019-04-30
xshell连接linux速度很慢或者连接一段时间后会自动断
2019-04-30
Hadoop Windows插件配置
2019-04-30
存储 HDFS内部运行原理
2019-04-30
二丶存储+分析处理信息MapReduce内部原理
2019-04-30
static代码块设置全局变量和eclipse java配好HDFS类对HDFS的操作
2019-04-30
在Eclipse上安装Hadoop插件
2019-04-30
Java架构师必须掌握哪些技术?
2019-04-30
学习Python语言具应用领域有哪些?
2019-04-30
五分钟带你了解,前端的发展历程及工作职责!
2019-04-30
未来UI设计趋势,你了解吗?
2019-04-30
Java程序员面试有妙招,助你逆袭成功!
2019-04-30
互联网的行业都有哪些岗位?
2019-04-30