你是真的“C”——函数递归详解汉诺塔

简介: 利用函数递归手把手求解汉诺塔
   哈喽!😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不多说,文章推上!欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘

前言🙌

    哈喽各位友友们😊,我今天又学到了==很多有趣的知识==, 现在迫不及待的想和大家分享一下!😘我仅已此文,手把手带领大家 用函数递归的方法解决汉诺塔问题!都是精华内容,可不要错过哟!!!😍😍😍

函数递归之汉诺塔详解分析🙌

汉诺塔问题的简介😊


    相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根柱子(编号A、B、C),在A柱自下而上、由大到小按顺序放置64个金盘(如图1)。游戏的目标:把A柱上的金盘全部移到C柱上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根柱上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一柱子上。
    而将64个圆盘从A柱借助B柱,移动到C柱需要多长的时间呢?通过平常的方法是很难计算的。今天我用递归的思想来计算一下汉诺塔的移动次数和汉诺塔的移动步骤!

汉诺塔的移动图解😊

    首先,我们来分析一下汉诺塔移动圆盘的规律:一次只能移动一个圆盘,并且小盘在上,大盘在下!
接下来以3层汉诺塔的移动图解举例说明:
在这里插入图片描述
假设我们现在有n个圆盘,这样就可以推导出n层汉诺塔的移动规律啦:

  • 步骤1:==将n-1个圆盘从A柱移动到B柱上面;==
  • 步骤2:==将第n个圆盘从A柱移动到B柱上;==
  • 步骤3:==将n-1个圆盘从B柱移动到C柱上。==

汉诺塔移动次数的推导: 😍

  • 当 n =1 时,移动次数为1次;
  • 当 n = 2时,移动次数为3次;
  • 当 n = 3时,移动次数为7次;
  • 当 n = 4时,移动次数为15次;
  • 当 n = 5时,移动次数为31次。

............. 移动次数为2^n-1次。

可以分析出:步骤1的移动步数就是n-1个圆盘移动所需的步数;步骤2的移动步数为1;步骤3的移动步数与步骤1一样。==第n层的汉诺塔 = 前一层汉诺塔移动所需的次数+1+前一层汉诺塔移动所需的次数==。

因此,利用数学上的函数表达式,将n-1个盘子的移动视为F(n-1)
在这里插入图片描述)

大概的思路理清楚以后,我再用代码的形式实现出来辅助大家的理解: 😍

#include<stdio.h>
int  HanoiStep(int n)
{
    if (n <= 1)
        return 1;
    else
        return 2 * HanoiStep(n - 1) + 1;

}

int main()
{
    int n = 0;
    scanf("%d", &n);
    int ret = HanoiStep(n);
    printf("%d层汉诺塔的移动次数:%d\n",n,ret);
    return 0;
}

代码测试结果图: 😍
在这里插入图片描述

汉诺塔具体的移动过程展示😊

这里所要实现的效果是将汉诺塔的每一步移动都展示出来。我先按照上面总结出来的规律,将1~4层的汉诺塔的移动过程推导出来。 😍
我们可以从上述规律中可以进一步推导出n层汉诺塔的规律和移动过程。

在这里插入图片描述
在这里插入图片描述

不难发现,上述的推导过程和所总结出的规律,汉诺塔的移动可以通过==递归的方法==实现出来。

具体的代码实现:😍

#include<stdio.h>
void  HanoiMove(int n,char A,char B,char C)//n表示的是汉诺塔层数,A,B,C表示的柱子标号
{
    if (n == 1)
    {
        printf("%c -> %c\n", A, C);
    }
    else
    {
        HanoiMove(n - 1, A, C, B);//将n-1个圆盘从A移动到B柱
        printf("%c -> %c\n", A, C);//将第n个圆盘从A移动到C柱
        HanoiMove(n - 1, B, A, C);//将n-1个圆盘从B移动到C柱
    }
        

}

int main()
{
    int n = 0;
    scanf("%d", &n);
    HanoiMove(n, 'A', 'B', 'C');
    return 0;
}

代码测试结果图: 😍
在这里插入图片描述

总结撒花💞

   当我们将每次移动看作一秒,你就会发现汉诺塔问题的难处咯!那么移动的 时间为:2 ^ 64 - 1 = 18,446,744,073,709,551,615秒,换算成年数,约为5800亿年。按照这个进度,移到 世界毁灭都不一定能够将64个圆盘全部从A柱移动到C柱上(捂脸)。==本篇文章旨在带领大家使用函数递归的知识来求解经典的汉诺塔问题==。希望大家通过阅读此文有所收获!😘如果我写的有什么不好之处,请在文章下方给出你宝贵的意见😊。如果觉得我写的好的话请点个赞赞和关注哦~😘
相关文章
|
8天前
|
弹性计算 人工智能 对象存储
阿里云服务器最新优惠价格表:含 ECS、轻量、GPU 配置及收费标准
阿里云服务器多少钱?阿里云服务器优惠价格表:涵盖轻量应用服务器、ECS 云服务器、GPU 服务器等主流产品,低至 38 元1年、99元和199元收费,部分配置升级至 200M 带宽且不限流量,无论是个人开发者、中小企业还是大型企业,都能找到适配需求的高性价比方案。以下是整理的阿里云最新优惠价格及配置详情::轻量应用服务器200M峰值带宽68元1年(秒杀38元),ECS云服务器2核2G3M带宽99元一年、2核4G、5M带宽、80G系统盘优惠价格199元一年,4核16G服务器10M带宽89元1个月,8核32G服务器10M固定带宽160元一个月,阿里云香港轻量服务器200M带宽25元个月起。方便大
|
开发框架 JavaScript 小程序
vue,小程序,uni-app的生命周期?
vue,小程序,uni-app的生命周期?
|
11月前
|
JavaScript 前端开发 容器
盘点JavaScript中所有声明变量的方式及特性
本文详细介绍了JavaScript中变量定义的多种方式,包括传统的`var`、`let`和`const`,以及通过`this`、`window`、`top`等对象定义变量的方法。每种方式都有其独特的语法和特性,并附有代码示例说明。推荐使用`let`和`const`以避免作用域和提升问题,谨慎使用`window`和`top`定义全局变量,不建议使用隐式全局变量。掌握这些定义方式有助于编写更健壮的JS代码。
309 11
|
JavaScript
vue里样式不起作用的方法,可以通过deep穿透的方式
vue里样式不起作用的方法,可以通过deep穿透的方式
773 0
|
运维 Kubernetes 负载均衡
震惊!容器化运维竟藏如此大招,容器调度与服务编排让你的软件部署 “逆天改命”
【8月更文挑战第31天】在数字化时代,容器化技术革新了软件开发与运维方式,其高效、灵活及可移植的特点为企业应用部署提供了全新方案。容器调度与服务编排作为核心环节,通过优化资源分配、提升系统可靠性和可扩展性,实现了自动化管理。Kubernetes 等工具不仅简化了容器调度,还通过 Deployment、Service、Ingress 等资源对象实现了复杂应用架构的自动化运维,大幅提高了资源利用率和系统稳定性,减少了人工干预,加速了企业数字化转型。
285 2
|
JavaScript 前端开发 机器人
Github 2024-06-17 开源项目周报 Top15
根据Github Trendings的统计,本周(2024年6月17日)共有15个项目上榜。按开发语言分类,Python项目最多,达6项;TypeScript和JavaScript各有3项;PHP、Blade、Lua、Dart及非开发语言项目各1项。这些项目涵盖从零构建技术、智能家居、高性能数据库到情感语音模型等多个领域,体现了开源社区的多样性和创新力。
517 0
|
存储 算法 安全
深入解析消息认证码(MAC)算法:HmacMD5与HmacSHA1
深入解析消息认证码(MAC)算法:HmacMD5与HmacSHA1
|
Java Android开发 UED
安卓scheme_url调端:如果手机上多个app都注册了 http或者https 的 intent。 调端的时候,调起哪个app呢?
当多个Android应用注册了相同的URL Scheme(如http或https)时,系统会在尝试打开这类链接时展示一个选择对话框,让用户挑选偏好应用。若用户选择“始终”使用某个应用,则后续相同链接将直接由该应用处理,无需再次选择。本文以App A与App B为例,展示了如何在`AndroidManifest.xml`中配置对http与https的支持,并提供了从其他应用发起调用的示例代码。此外,还讨论了如何在系统设置中管理这些默认应用选择,以及建议开发者为避免冲突应注册更独特的Scheme。
|
监控 API C语言
【Python 基础教程 22】全面揭秘Python3 os模块:从入门到高级的实用教程指南
【Python 基础教程 22】全面揭秘Python3 os模块:从入门到高级的实用教程指南
536 1
|
开发框架 物联网 云计算
Qt应用领域分析与实践
Qt应用领域分析与实践
752 0