最干hanoi,看完直呼口干舌燥

  • Hanoi(汉诺塔问题)
    • 一、什么是汉诺塔
    • 二、分析
      • 1、移动过程
      • 2、应用思想+函数雏形
      • 3、部分代码
    • 三、总代码
    • 四、递归调用
  • OVER

Hanoi(汉诺塔问题)

一、什么是汉诺塔

在研究汉诺塔问题时,我们要明白到底什么是汉诺塔。

1、有三根相邻的柱子,标号为A,B,C。 2、A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘。
3、现在把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方。

关于汉诺塔的基本玩法呢,
大家也可以去度娘上搜索一下,切实感受一下。
本篇主要介绍解决汉诺塔问题的思想,所以玩法就不过多赘述。

二、分析

1、移动过程

就可以将其抽象成(这里是破解汉诺塔思想的关键):
假设A杆上有n个圆盘
第一步:把n - 1个圆盘从A杆经由C杆移动到B杆

第二步:将A杆上的第n个圆盘移动到C杆

第三步:再将n - 1个圆盘从B经A移动到C

2、应用思想+函数雏形

通过分析我们可以发现,汉诺塔问题其实就是运用了递归的思想:
1.有一个跳出条件:
n = 1时
只剩下一个圆盘,所以直接移动到C杆就好了

2.逐渐的接近这一跳出条件:
移动n个圆盘和移动n-1个圆盘的过程本质上是相似的;
但是其中的过程又完全不一样,因为圆盘插入的杆子变了
所以hanoi的函数雏形就可以大致表达出来


函数共有四个未知数,其中n代表圆盘的个数,A,B,C分别代表的三个杆子。

第一步:把n - 1个圆盘从A杆经由C杆移动到B杆
第二步:将A杆上的第n个圆盘移动到C杆
第三步:再将n - 1个圆盘从B经A移动到C

所以将上述三步用代码语言写出就是这样
其中要注意的是,第二步永远只是将A杆上的第n个圆盘移动到C杆,所以不是递归函数。

3、部分代码

通过上述的分析我们就可以得出hanoi函数部分的代码:

void hanoi(int n,char A,char B,char C)
{if(1 == n)//跳出条件move(A,C);else{hanoi(n-1,A,C,B);//第一步move(A,C);//第二步hanoi(n-1,B,A,C);//第三步}

以及显示圆盘移动轨迹的move部分代码:

//显示圆盘的移动轨迹
void move(char c1,char c2)
{printf("%c -> %c\n",c1,c2);//从c1到c2
}

三、总代码

#include<stdio.h>
//显示圆盘的移动轨迹
void move(char c1, char c2)
{printf("%c -> %c\n", c1, c2);//从c1到c2
}
void hanoi(int n, char A, char B, char C)
{if (1 == n)//跳出条件move(A, C);else{hanoi(n - 1, A, C, B);//第一步move(A, C);//第二步hanoi(n - 1, B, A, C);//第三步}
}
int main()
{int n;printf("请输入圆盘的个数:");scanf("%d", &n);hanoi(n, 'a', 'b', 'c');return 0;
}

最后输出的结果就是圆盘的移动过程。

四、递归调用

如果还是不能够了解递归调用的这个过程,下面这张递归调用图可以帮助大家进一步了解整个运行的过程。

OVER

不会吧,不会吧,全网最细汉诺塔讲解,不会有人不知道吧。面试官直呼内行,看完只想默默找水喝(C语言)相关推荐

  1. 全网最细之static关键字讲解

    package com.wuming.oop.demo07;public class Person {//2:赋初值{System.out.println("匿名代码块");}// ...

  2. 全网最细海龟 (turtle) 画图讲解 (五):输入/输出文字及鼠标与键盘交互设计

    目录 一.输入/输出文字 1. 输出文字 2. 输入文字 二.鼠标与键盘交互设计 1. 键盘事件 2. 鼠标事件 2.1 获取鼠标点击的位置 3. 计时器 最近博主在 CSDN 上看到许多关于海龟画图 ...

  3. 全网最细海龟 (turtle) 画图讲解 (四):绘制图形

    目录 1. 绘制图形 1.1 绘制线条 1.2 绘制矩形 1.3 绘制圆或弧形 1.3.1 绘制五环图案 1.4 绘制多边形 1.5 绘制填充图形 1.6 将绘制的图形定义为画笔形状 最近博主在 CS ...

  4. 全网最全面的python的讲解,讲的无可挑剔《记得收藏》

    全网最全面的python的讲解,讲的无可挑剔<记得收藏> 目录 1.简介 Pyhon中如何文件拷贝 Python数学库及其应用 Python异常处理机制 ETC turtle库的常用指令 ...

  5. 「全网最细」:MRP1视图所有字段详解及实战应用 - 合集

    : 视频详解 注:本文章建议要结合视频进行观看 声明:本文仅代表原作者观点,仅用于SAP软件的应用和学习,不代表SAP公司.注:文中所示截图来源于SAP软件或PA官方教材,相应著作版权归SAP所有. ...

  6. `全网最细!! 入门必看Git教程链接:https://gitee.com/all-about-git`

    > 全网最细!!

  7. 动态规划——0/1背包问题(全网最细+图文解析)

    ✨动态规划--0/1背包问题(全网最细+图文解析) 作者介绍:

  8. “保姆级”车载CAN总线教程(二)-堪称全网“最细”系列

    目录 1.CAN总线的帧类型 1.1数据帧 1.2错误检测与错误帧 2.位填充机制 上节从宏观上对CAN总线的发展及工作原理等进行了介绍,本节内容将是整个CAN总线的核心内容,即可谓之"硬菜 ...

  9. 米联客FDMA及其控制器代码逐行讲解,全网最细,不接受反驳

    米联客FDMA及其控制器代码逐行讲解,全网最细,不接受反驳 对于做图像处理的兄弟来说,图像缓存是基本操作,一般是图像三帧缓存于DDR3,然后再读出显示,DDR3操作很复杂,所以Xilinx官方出了个M ...

最新文章

  1. UIButton长按事件
  2. Python将彩色图转换为灰度图
  3. python 奇偶链表
  4. 又重装了系统win8+office2013+sql2012+tfs2012+vs2010+vs2012+xna4+kinectsdk1.6+wp8sdk
  5. Java未来路在何方?图文详解!
  6. golang如何生成随机数
  7. goto语句_C语言goto语句
  8. Tricks(十九)—— 获得 list of lists 每一列的最大最小值
  9. 关于ARM指令中位置无关和位置相关代码的认识【转】
  10. 张俊芳电机学18章计算题以及答案
  11. linux服务器测网速,linux服务器如何测试网速
  12. 如何将微信电脑图片dat格式文件转换为jpg格式
  13. uni-app -- 小程序添加激励视频(字节-抖音小程序)
  14. 外边框HTML代码,HTML代码-边框篇
  15. 从零开始学Python【38】--朴素贝叶斯模型(实战部分)
  16. influx db高可用部署方案
  17. 什么是白马股,它与蓝筹股有什么区别?
  18. GCC生成静态库和动态库
  19. Html5浪漫结婚请柬婚礼网站模板❤_爱她就给她最美的H5婚礼请柬_(婚庆电子邀请函)含背景音乐
  20. 「五度易链」我国华为、阳光电源逆变器出货量连续多年位居全球榜首

热门文章

  1. 【记录+解决】ubuntu服务器显卡驱动安装;Ubuntu20.04重启后找不到Nvidia显卡驱动
  2. 一文看完计算机基础知识总结
  3. 贝叶斯统计-0531
  4. luogu1359 租用游艇
  5. Verilog结构描述
  6. python异常大总结
  7. 华为交换机 STP MSTP BPDU保护 边缘端口 BPDU过滤 根保护 环路保护 TC保护
  8. android 使用ios字体大小,ios和android上的字体大小不同
  9. App 测试中 ios 和 Android 有哪些区别
  10. 软件测试管理工具——禅道(安装、讲解)