【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个柱子。三个柱子中必定是有一个辅助移动柱的,在函数参数中把放在中间的当作辅助柱才行。这个代码如果你仔细去写出过程其实是比较麻烦的,因为我最近也没有太多时间所以我就不在这里实现了,我之前有看到有个同学写出来过,还是比较麻烦的。

总结🍊

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

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

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

目录
相关文章
|
7月前
|
存储 程序员 C语言
C语言 (2)
C语言 (2)
37 0
|
24天前
|
传感器 安全 算法
【C语言】C语言可以做什么?
C语言因其高效、灵活和低级控制能力,被广泛应用于各个领域,从基础设施和科学计算到金融、交通和机器人技术。它在许多关键应用中展示了其不可替代的价值和广泛的适用性。
68 2
|
2月前
|
Unix 程序员 C语言
初识C语言
C语言源于1972年,由贝尔实验室的丹尼斯·里奇和肯·汤普逊在开发UNIX操作系统过程中设计。它基于B语言改进而成,旨在成为一种实用的编程工具。尽管许多语言追求教育或易用性目标,但专为程序员设计的C语言,如今已成为主流编程语言之一。
29 8
|
6月前
|
C语言
【C语言】:图形打印
【C语言】:图形打印
58 0
|
存储 编译器 C语言
你应该知道的C语言干货(1)
小数直接写出来编译器默认为double类型,后面加上f才是float类型
88 0
|
C语言
C语言中的坑(1)
C语言中的坑(1)
53 0
C4.
|
7月前
|
存储 算法 安全
C语言的算法结构
C语言的算法结构
C4.
90 0
|
7月前
|
双11 C语言
C语言:练习2
C语言:练习2
75 0
|
7月前
|
C语言
C语言中的exit函数
C语言中的exit函数
151 0
|
C语言
C语言:%d, %2d, %02d 等
C语言:%d, %2d, %02d 等