当前位置: 首页 > news >正文

C语言实现汉诺塔

这是一个古典的数学问题,是一个只有用递归方法解决的问题。问题是这样的:古代有一个梵塔,塔内有3个座A,B,C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到B座,但每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用C座。要求编程打印出移动的步骤。

其目的是让A中的盘子通过C全部移动到B上面,A为起始,B为终止,C是中转。其中设计到了递归思想,首先写一段打印代码

void move(char pos1,char pos2)
{printf("%c->%c\n",pos1,pos2);
}

目的是等下在递归中频繁调用打印操作,从而建去了一系列的操作。

其次是实现核心代码,

void Hanoi(int n,char pos1,char pos2,char pos3)
{if(n==1){move(pos1,pos2);}else{Hanoi(n-1,pos1,pos3,pos2);move(pos1,pos2);Hanoi(n-1,pos3,pos2,pos1);}
}

这里只针对汉诺塔进行分析,详细递归还需大家慢慢积累,

首先定义n个盘子,pos1为起止地,POS3为中转地,POS2为目标地,递归是有结束条件的,结束的条件就是最后一个盘子从起止地挪到目标地,用代码实现就是move(pos1,pos2),当n不等于1时,程序进入其他选项,根据顺序要把第一个盘子先挪到目标地,要挪到最底下的盘子就要先挪动上面的n-1个盘子,将他们从pos1起始挪到pos3中转,然后最低下的盘子可以从pos1挪到pos2了,就调用move这个函数,当把最底下的盘子挪了之后,就又要将序最底下序号n-1个盘子以pos3为起止,然后以pos1为中转,挪到到pos2目标,依次类推,一个汉诺塔的递归就实现了,最后是源代码。

#include<stdio.h>
void move(char pos1,char pos2)
{printf("%c->%c\n",pos1,pos2);
}
void Hanoi(int n,char pos1,char pos2,char pos3)
{if(n==1){move(pos1,pos2);}else{Hanoi(n-1,pos1,pos3,pos2);move(pos1,pos2);Hanoi(n-1,pos3,pos2,pos1);}
}
int main()
{int a;scanf("%d",&a);Hanoi(a,'A','B','C');
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • CodeMeter 8.20AxProtector 11.50版本更新
  • 计算机视觉——GFLOPs、FLOPS和FLOPs的区别和联系
  • 【AI学习笔记】初学机器学习西瓜书概要记录(二)常用的机器学习方法篇
  • 【C++】透析string类
  • Kafka+PostgreSql,构建一个总线服务
  • 828华为云征文|部署在线文件管理器 Spacedrive
  • Winform登录实现及工具栏切换
  • Selenium等待机制:理解并应用显式等待与隐式等待,解决页面加载慢的问题
  • electron-vite vue3离线使用monaco-editor
  • 剃(磨)前插齿刀设计计算开发第二步:
  • SIP Servlets学习
  • 打通最后一公里:使用CDN加速GitHub Page的访问
  • Matlab 的.m 文件批量转成py文件
  • 《机器学习by周志华》学习笔记-神经网络-02感知机与多层网络
  • 解密与推广IAB/MRC零售媒体测量指南
  • @jsonView过滤属性
  • Brief introduction of how to 'Call, Apply and Bind'
  • Docker下部署自己的LNMP工作环境
  • JAVA SE 6 GC调优笔记
  • JavaScript类型识别
  • JAVA多线程机制解析-volatilesynchronized
  • JS学习笔记——闭包
  • leetcode-27. Remove Element
  • Linux Process Manage
  • Redux系列x:源码分析
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • spark本地环境的搭建到运行第一个spark程序
  • Vue组件定义
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 多线程 start 和 run 方法到底有什么区别?
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 老板让我十分钟上手nx-admin
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • Semaphore
  • ​2021半年盘点,不想你错过的重磅新书
  • ‌JavaScript 数据类型转换
  • #DBA杂记1
  • #laravel 通过手动安装依赖PHPExcel#
  • #systemverilog# 之 event region 和 timeslot 仿真调度(十)高层次视角看仿真调度事件的发生
  • $L^p$ 调和函数恒为零
  • (LeetCode C++)盛最多水的容器
  • (八)Flask之app.route装饰器函数的参数
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (利用IDEA+Maven)定制属于自己的jar包
  • (十八)SpringBoot之发送QQ邮件
  • (四)模仿学习-完成后台管理页面查询
  • (一)kafka实战——kafka源码编译启动
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)socket Aio demo
  • (转)程序员技术练级攻略
  • (转)关于pipe()的详细解析
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .NET C# 操作Neo4j图数据库