你是真的“C”——函数递归详解汉诺塔+青蛙跳台阶

news2024/11/28 2:31:47

函数递归详解汉诺塔+青蛙跳台阶问题😎

  • 前言🙌
  • 函数递归之汉诺塔详解分析🙌
    • 汉诺塔问题的简介😊
    • 汉诺塔的移动图解😊
    • 汉诺塔具体的移动过程展示😊
    • 汉诺塔的难处所在:😊
  • 函数递归之青蛙跳台阶详解分析🙌
    • 青蛙跳台阶的问题是什么样的问题?😊
  • 总结撒花💞

   哈喽!😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不多说,文章推上!欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘

前言🙌

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

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

汉诺塔问题的简介😊


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

汉诺塔的移动图解😊

    首先,我们来分析一下汉诺塔移动圆盘的规律:一次只能移动一个圆盘,并且小盘在上,大盘在下!假设我们现在有n个圆盘,那么大概移动的思路是:

  1. 先要把n-1个圆盘从A柱移动到B柱上;
  2. 再把第n个圆盘(最大的圆盘)从A柱移动到C柱上;
  3. 最后把n-1个圆盘从B柱移动到C柱上。

以三层汉诺塔举例说明: 😍

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述
由三层的汉诺塔可以推导出n层汉诺塔的移动次数: 😍

  • 步骤1的移动步数就是n-1个圆盘移动所需的步数,我们可以将其步数视为f(n-1)步;
  • 步骤2的移动步数为1;
  • 步骤3的移动步数与步骤1一样,步骤3的移动步数也是f(n-1)步。
    小结一下😍:对于1层汉诺塔移动次数为1次,对于其他层数的汉诺塔则为:前一层汉诺塔移动所需的次数+1+前一层汉诺塔移动所需的次数。
    因此可以得到递推公式:f(n-1)+ 1 + f(n-1)= 2 * f(n-1)+ 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层的汉诺塔的移动过程推导出来。 😍在这里插入图片描述
由图表可知😍:我们可以从上述规律和1~4层移动步骤的过程展示中可以进一步推导出n层汉诺塔的规律和移动过程。

n层汉诺塔的推演过程: 😍

  • 把n-1个圆盘从A移动到B柱上;
  • 把第n个圆盘从A移动到C柱上;
  • 把n-1个圆盘从B移动到C柱上。

n-1个圆盘从A移动到B的推演过程: 😍

  • 把n-2个圆盘从A移动到C柱上;
  • 把第n-1个圆盘从A移动到B柱上;
  • 把n-2个圆盘从C移动到B柱上。

以此类推,对于n-1个圆盘从B移动到C柱上,可以推测出来: 😍

  • 把n-2个圆盘从B移动到A柱上;
  • 把第n-1个圆盘从B移动到C柱上;
  • 把n-2个圆盘从A移动到C柱上。

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

代码实现思路归纳: 😍

  1. 先定义A,B,C三个字符,表示A,B,C三根柱子。定义变量n为汉诺塔层数。
  2. 对于一层汉诺塔而言,直接移动即可,对于其他层数的汉诺塔来说,则需要递归展开。

具体的代码实现:😍

#include<stdio.h>
void  HanoiMove(int n,char A,char B,char 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;
}

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

汉诺塔的难处所在:😊

   了解了汉诺塔的移动步数和过程,当我们对64片黄金圆盘移动完需要的时间做一个估算时,你就会发现汉诺塔问题的难处咯!当我们将每次移动看作一秒,那么时间为:2 ^ 64 - 1 = 18,446,744,073,709,551,615秒,换算成年数,约为5800亿年。按照这个进度,移到世界毁灭都不一定能够将64个圆盘全部从A柱移动到C柱上(捂脸)。

函数递归之青蛙跳台阶详解分析🙌

青蛙跳台阶的问题是什么样的问题?😊

青蛙跳台阶问题简述: 😍
   一只青蛙可以一次跳 1 级台阶或一次跳 2 级台阶。例如:跳上第一级台阶只有一种跳法:直接跳 1 级即可。跳上两级台阶,有两种跳法: 每次跳 1 级,跳两次; 或者一次跳 2 级。问要跳上第 n 级台阶有多少种跳法?

在这里插入图片描述

   理清楚思路之后,我们不能发现,青蛙跳台阶的问题也是可以通过函数递归的方法来实现的。
青蛙跳台阶递归代码实现: 😍

int Frog(int n)
{
	if (n == 1)
		return 1;
	else if (n == 2)
		return 2;
	else if (n >= 3)
		return Frog(n - 1) + Frog(n - 2);
}
#include<stdio.h>
int main()
{

	int n = 0;
	scanf("%d", &n);
	int ways = Frog(n);
	printf("跳%d阶台阶方法总数为:%d\n", n, ways);
	return 0;
}

代码测试结果图: 😍
在这里插入图片描述
当 n = 4时
Frog (4)
= Frog(3)+ Frog(2)
= Frog (2) + Frog(1)+ Frog(2)
= 2 + 1 +2
= 5

总结撒花💞

   本篇文章旨在带领大家使用函数递归的知识来求解经典的汉诺塔问题和青蛙跳台阶问题。希望大家通过阅读此文有所收获!😘如果我写的有什么不好之处,请在文章下方给出你宝贵的意见😊。如果觉得我写的好的话请点个赞赞和关注哦~😘

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/166708.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从头安装gdal库(Linux环境下的Python版)

目录前言GDAL安装SWIG安装proj 安装sqlite安装pkg-config 安装其他报错No package libtiff-4 foundPackage liblzma, required by libtiff-4, not foundPackage libjpeg, required by libtiff-4, not foundPackage zlib, required by libtiff-4, not foundchecking for curl-co…

Windows下IIS部署网站流程

IIS Internet information service 是一个web服务器 1. IIS用于windows系统 2.apache用于Linux系统&#xff0c;JAVA的web服务器 3.Nginx用于Linux&#xff0c;负责负载均衡&#xff0c;反向代理 安装完IIS之后&#xff0c;去更改DNS的指向。 DNS指向&#xff1a;IP 和 域名 的…

Dopamine-PEG-N3,多巴胺聚乙二醇叠氮 科研试剂用于点击化学

中文&#xff1a;多巴胺-聚乙二醇-叠氮 英文&#xff1a;Dopamine-PEG-N3&#xff0c;DOPA-PEG-azide 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 用 途&#xff1a;仅供科研实验使用&#xff0c;不用于诊治 外观: 固体或粘性液体&#xff0c;取决于分子量 …

3D游戏引擎系统源码C++本科毕业设计,C++ 3D引擎源码,渲染系统使用的OpenGL 及 OpenGL ES

Effective 3D Engine 渲染系统使用的OpenGL 及 OpenGL ES&#xff0c;Windows上OpenGL ES使用AMD的ES模拟器。 环境部署 完整代码下载地址&#xff1a;3D游戏引擎系统源码C本科毕业设计 Win32环境配置 编辑器 将proj_win32/RenderSystem/gles_renderSystem/GLES/dll 中的d…

【web】微信小程序笔记小结(模板与配置)

来源&#xff1a;黑马程序员前端微信小程序开发教程 目录 I. WXML 模板语法 ① 数据绑定 ※※ 基本原则 ※※ 在 data 中定义数据 ※※ 在 WXML 中使用数据 ※※※※ Mustache 语法的格式 ※※※※ Mustache 主要应用场景 1&#xff09;动态绑定内容 2&#xff09;动…

测试篇(二): 如何合理的创建bug、bug的级别、bug的生命周期、跟开发产生争执怎么办

目录一、如何合理的创建bug二、bug的等级三、bug的生命周期四、和开发产生争执怎么办一、如何合理的创建bug 创建Bug的目的就是为了能够让其他人可以尝试复现 一个合格的bug应该包含以下一个要素&#xff1a; 发现问题的版本 例如Web程序对应的浏览器版本&#xff0c;或某个应…

AutoLISP 演练(一)

一、输入左下角点、矩形宽、矩形高后&#xff0c;自动的将图形依所给的条件画出二、变量约定本程序所需的AutoLisp功能函数&#xff08;setq 变量名 变量值&#xff09; ⬅ 设定变量值&#xff08;getpoint [基点] [提示]&#xff09; ⬅ 请求参考基点输入一个点坐标(getreal […

PyTorch中contiguous、view、Sequential、permute函数的用法

在pytorch中&#xff0c;tensor的实际数据以一维数组&#xff08;storage&#xff09;的形式存储于某个连续的内存中&#xff0c;以“行优先”进行存储。 1. tensor的连续性 tensor连续&#xff08;contiguous&#xff09;是指tensor的storage元素排列顺序与其按行优先时的元素…

【前端】列表页点进某个详情页,详情页可按顺序跳转到上一条/下一条的实现思路(2种)

需求概述 列表页展示列表&#xff0c;点击某个列表可以跳转到对应的详情页&#xff0c;点击上一页下一页可以按列表顺序跳转到对应详情页。比如点击列表2进入到详情2&#xff0c;我点上一页可以跳转到详情1&#xff0c;点击下一页可以跳转到详情3。难点&#xff1a;详情页如何…

Http客户端 Feign 的使用 (黑马springcloud笔记)

Feign基本使用 目录Feign基本使用一、Feign代替RestTemplate二、自定义配置三、Feign使用优化1. 底层优化2. 日志优化四、最佳实践方式一&#xff1a;继承方式二&#xff1a;抽取一、Feign代替RestTemplate 步骤&#xff1a; 引入依赖 <dependency><groupId>org.s…

UITableView内输入框(UITextView)换行

业务描述&#xff1a; UITableView内存在一个Cell&#xff0c;该Cell内有一输入框可以输入文字&#xff0c;超出输入框宽度则换行展示&#xff0c;即该Cell高度要增加 如图&#xff1a; 解决方法&#xff1a; 思路&#xff1a; 1:取到最大输入框宽度 2:计算当前文字宽度与最…

QT自定义控件工程结构框架

目录前言一、cutewidgets是什么&#xff1f;二、工程结构三、框架的工程配置1 cutewidgets.pro2 cutewidgets.pri2.1 cutewidgetsconfig.pri2.2 cutewidgetsfunctions.pri2.3 cutewidgetsbuild.pri四、源码1 src1.1 src.pro1.2 cutewidgets_global.h1.3 testedit1.4 扩展2 exam…

互联网中断检测技术窥览与讨论

前言&#xff1a; 如其他人造系统一样&#xff0c;互联网的运行也会出现异常甚至中断。仅在2022年就发生了多起影响重大的互联网中断事件&#xff1a;1月15日汤加火山喷发三个小时后&#xff0c;全国断网&#xff0c;和外界的所有电话与网络联系都无法接通&#xff1b;3月28日…

系统分析师案例必备知识点汇总---2023系列文章二

需求获取 1、需求获取的技术&#xff1a; 用户访谈 优点&#xff1a;具有良好的灵活性&#xff0c;有较宽广的应用范围。 缺点是&#xff1a;用户忙&#xff0c;信息量大&#xff0c;记录困难&#xff0c;需要沟通技巧。 问卷调查 优点&#xff1a;短时间内收集数据。 缺点…

Python aiohttp 库是否值得学?那必须要掌握呀

aiohttp 是一个基于 asyncio 的异步 HTTP 客户端/服务器库。它提供了一组用于编写高性能异步网络应用程序的工具&#xff0c;包括基于协程的客户端和服务器。 库的安装使用 pip install aiohttp Python aiohttp 库通过 aiohttp 搭建服务器aiohttp 路由aiohttp 中间件aiohttp 发…

【机器学习之模型融合】Blending混合法

前言 Stacking堆叠法基础知识&#xff1a;http://t.csdn.cn/dzAna 1、Blending的基本思想与流程&#x1f47f; Blending融合是在Stacking融合的基础上改进过后的算法。在之前的课程中我们提到&#xff0c;堆叠法stacking在level 1上使用算法&#xff0c;这可以令融合本身向着损…

好家伙,这几个隐藏功能,太香了

很多小伙伴可能被小畅的问题搞糊涂了&#xff0c;因为很多人只会在电脑上堆砌各种小应用&#xff0c;而忽略了Windows原有的实用功能。 而我们也千万不要小看这些功能&#xff0c;它们说不定能在关键时刻助你一臂之力&#xff0c;帮到你不少忙呢&#xff01; 那么今天小畅就为大…

MobaXterm连接出现 Network error: Connection timed out 问题解决

MobaXterm连接出现 Network error: Connection timed out&#xff1a; 接前文&#xff1a;CentOS安装, 点此查看文章&#xff0c;安装之后的SSH连接&#xff1a; 解决思路如下&#xff1a; 1、检查虚拟机端是否安装ssh 一般情况是可以自动安装的&#xff0c;直接在终端输入s…

系统分析师案例必备知识点汇总---2023系列文章一

一、系统规划 (视频内容&#xff1a;系统分析师-专业知识模块中的系统规划视频) 1 、可行性研究 经济可行性 技术可行性 法律可行性 用户使用可行性 也称为投资收益分析 或成本效益分析&#xff0c;主 要评估项目的建设成 本、运行成本和项目 建成后可能的经济收 益。 技…

eggjs框架源码解读

文章目录前言Egg进程模型Egg应用程序结构egg运行启动的内幕加载插件扩展内置对象加载中间件加载service加载路由加载配置设置应用信息执行业务逻辑文件加载机制结语前言 eggjs 是阿里在 Nodejs 技术上的一大杰作&#xff0c;也是对开源世界的一大贡献。里面包含了很多技术结晶…