【C语言】汉罗塔

简介: 【C语言】汉罗塔

前言

🎈大家好,我是何小侠🎈

🌀大家可以叫我**小何或者小侠🌀**

🔴我是一名普通的博客写作者🔴

💐希望能通过写博客加深自己对于学习内容的理解💐

🌸也能帮助更多人理解和学习🌸

🍃我的主页:何小侠的主页🍃


这篇博客我们一起来学习汉罗塔,或者说学习递归。希望这篇博客能帮助大家理解和学习

引子🍊

在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片,一次只移动一片,不管在哪根针上,小片必在大片上面。当所有的金片都从梵天穿好的那根针上移到另外一概针上时,世界就将在一声霹雳中消灭,梵塔、庙宇和众生都将同归于尽

汉罗塔解析🍊

我们先来看一个gif

这里有三个柱子,我们从左至右称为A柱,B柱,C柱。

我们先从一个圆盘开始分析

ru

如果只有一个柱子我们就只需要把柱子从A——>C就行了。

然后我们再来看看有两个圆盘呢?

我们看到我们先讲小圆盘移动到B柱,再把大圆盘移动到C柱,然后再将小圆盘移动到C柱。

再加一个圆盘会是什么样?我们已经快接近规律了。

这个过程就逐渐变复杂起来了,由于我们已经试出了三种情况,我们可以大胆猜测汉罗塔的规律。

  • 当只有一个盘移动1次。
  • 有两个盘移动3次
  • 当有三个盘就移动7次
    (2 ^ n)-1
    如果我回顾到引子部分,n = 64 ,假设每个盘子的移动需要1秒那么就需要2^64 -1秒,假设一个人能活到80岁那么也只能活2522880000(25亿秒)秒,愚公移山可能都没这和尚这么绝望吧。

递归思路🍊

我们从上面其实还可以发现一个规律,如果有n个圆盘,我们其实只需要

  • 将n-1个柱子借助C柱移动到B柱,
  • 然后将最后一个盘子(也就是n盘)移动到C柱,
  • 最后再将n-1个圆盘借助A柱从B柱移动到C柱就行了。

这个过程分析是很简单的,但是要接受递归的这种思维是很难的,我最开始也不是很相信递归,但是递归见的多了后就更相信了。

代码🍊

#include<stdio.h>
int count = 0;
void HannoTower(char A, char B, char C, int n)
{
  count++;
  if (1 == n)
  {
    printf("把第%d个盘子从%c柱---->%c柱\n",n,A,C);
  }
  else
  {
    HannoTower(A, C, B, n - 1);
    //借助C柱从A柱将n-1个盘子移动到B柱
    printf("把第%d个盘子从%c柱---->%c柱\n",n, A, C);
    //将最后一个盘子移动到C柱
    HannoTower(B, A, C, n-1);
    //借助A柱从B柱将n-1个盘子移动到C柱
  }
}
int main()
{
  int n = 0;
  printf("请输入你想要和尚搬多少个盘子\n");
  scanf("%d", &n);
  HannoTower('A', 'B', 'C', n);
  printf("和尚搬了%d次", count);
  return 0;
}

我记得我刚遇到这个题目时也没有任何思路,一直在想用什么来表示柱子,后来看到别人的代码也还是不能算很懂为什么字符A,B,C就能直接表示柱子。

但是实际上我们也只需要操作一些数字和字符就够了。

A、B、C,3个字符为抽象成的3个柱子。三个柱子中必定是有一个辅助移动柱的,在函数参数中把放在中间的当作辅助柱才行。这个代码如果你仔细去写出过程其实是比较麻烦的,因为我最近也没有太多时间所以我就不在这里实现了,我之前有看到有个同学写出来过,还是比较麻烦的。

总结🍊

这篇博客我们系统的介绍了汉诺塔的实现,有没有对递归有感觉了呢?如果没有再多练习就行了!。

最后如果这篇博客有帮助到你,欢迎点赞关注加收藏

如果本文有任何错误或者有疑点欢迎在评论区评论

目录
相关文章
|
数据库
数据库第十一次作业 视图的应用
数据库第十一次作业 视图的应用
146 1
|
存储 分布式数据库 数据库
Django项目中使用Hbase的方法
Django项目中使用Hbase的方法
325 0
|
9月前
|
数据采集 机器学习/深度学习 数据可视化
探索大数据分析的无限可能:R语言的应用与实践
探索大数据分析的无限可能:R语言的应用与实践
366 9
|
SQL Oracle 关系型数据库
oracle11g SAP测试机归档日志暴增排查(二)
oracle11g SAP测试机归档日志暴增排查(二)
655 1
|
人工智能 搜索推荐
AI助力,短剧发展引来新的创新热潮
当前AIGC在短剧视频领域的应用尚不突出,但在文本和图像创作上已表现出色,各大厂商提供了多种体验良好的文生文、文生图服务。AI技术正快速改变短剧创作,从智能编剧到场景自动生成,极大提升了创作效率和内容多样性,预示着短剧领域的创新热潮。未来,短剧的创意将更多依赖于提供的文本提示词的创意性和准确性。
|
存储 编译器 数据处理
CPU架构和指令集
不同的CPU架构通常使用不同的指令集。每种CPU架构都有其自己的一组特定的机器指令,这些指令用于执行计算机程序。不同的CPU架构之间的指令集是不兼容的,这意味着编写的程序通常需要根据目标CPU的架构进行编译或汇编,以确保它们能够在该CPU上正确运行。 一些常见的CPU架构包括:
|
编解码 Go 图形学
Adobe Premiere Pro:掌控视频剪辑的魔法之手,让你的创作腾飞!
Adobe Premiere Pro:掌控视频剪辑的魔法之手,让你的创作腾飞!
425 2
|
消息中间件 存储 JSON
离线数仓(二)【用户行为日志采集平台搭建】(2)
离线数仓(二)【用户行为日志采集平台搭建】
|
搜索推荐 中间件 Go
Go语言微服务框架 - 11.接口的参数校验功能-buf中引入PGV
大量开发接口的朋友会经常遇到**接口参数校验**的问题。举个例子,我们希望将某个字段是必填的,如`name`,我们经常会需要做两步: 1. 在程序中加一个**判断逻辑**,当这个字段为空时返回错误给调用方 2. 在接口文档中加上**注释**,告诉调用方这个参数必填 一旦某项工作被拆分为两步,就很容易出现**不一致性**:对应到参数检查,我们会经常遇到文档和具体实现不一致,从而导致双方研发的沟通成本增加。那么,今天我将引入一个方案,实现两者的一致性。
276 0
|
计算机视觉
AQS
AQS
205 0