汉诺塔问题和爬楼梯(递归)

news2024/11/27 4:15:26

感谢大佬的光临各位,希望和大家一起进步,望得到你的三连,互三支持,一起进步

个人主页:LaNzikinh-CSDN博客

c语言基础_LaNzikinh篮子的博客-CSDN博客

文章目录 

  • 一.爬楼梯问题
  • 二.汉诺塔问题
  • 总结

一.爬楼梯问题

 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数

这个问题就是一个非常典型的递归问题,但是拿到题目的时候真的没有什么思路,不知道怎么去思考

思路:

递归的核心思想就是把大问题变成小问题,我们先来找爬楼梯的小问题,最简单的就是爬一个或者爬两个,那我爬n个怎么说呢?我爬到第N个有两种上去的方法,一种是在N减一个的时候爬一个楼梯,另一种就是在N -2个的时候爬两个楼梯,所以是f(n)=f(n-1)+f(n-2)

int fun(int n)
{
	if (n == 1)
		return 1;
	else if (n == 2)
		return 2;
	else
		return  f(n - 1) + f(n - 2);
}

这里用的是深度优先遍历,这个还是比较简单的

二.汉诺塔问题

游戏的规则:汉诺塔游戏规则如下12:

  • 有三根相邻的柱子,标号为A,B,C。
  • A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘。
  • 现在把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方。
  • 每次只允许一个人移动碟子,且每次仅允许移动一个碟子的位置。
  • 在团队所有成员必须依次移动盘子。
  • 在任意一次移动中,较小的盘子不得被置于较大的盘子下方。
  • 一次只能移动一个圆盘。

思路:A为起始柱子,B为中转柱子,C为目标柱子

注意:这些柱子在递归是会发生改变!!!

要想完成这个问题,首先得把上面两个放到中间去

然后再把最底下的放到目标地方

再把中间的放到目标上就可以了

函数递归很好写,但是非常难理解

void hanoi(int n, char A, char B, char C) {
    //n代表  A柱子上面的盘子数量
    if (n == 1) {
        move(n, A, C);//如果只有一个盘子,直接从A移动到C
    }
    else {
        hanoi(n - 1, A, C, B);//将n-1个盘子从A移动到B
        move(n, A, C);
        hanoi(n - 1, B, A, C); //将n-1个盘子从B移动到C
    }

}

move为打印函数

void move(int n, char x, char y) {
    printf("%c--->%c\n",x, y);
}

很多人理解了思想也写得出这个代码,但是就是想不通为什么完成了这个题目?

我觉得可能是因为没理解程序里面的参数是怎么回事,else里面的参数估计就有人看不明白了,在你第一次在主函数中把A,B,C 这三个字符输进去的时候,调用函数是没问题的,形参和实参一一对应,hanoi函数里面的A,B,C就对应着'A', 'B','C'三个柱子,但是你一旦开始递归,第一次递归函数里面的三个参数A,B,C代表的就是柱子'A',柱子'C',柱子'B'  了,每一次递归A,B,C三个参数代表的柱子都在不断的跳动,所以函数printf里面的从A到C进行输出,其实真正打印出来的各种移动情况都有,而else里面的第一句话执行完毕后,就是实现了把第一个柱上除了最后一个盘子上面的所有盘子移到了B,第二句其实是最初的参数和柱子对应的A和C,即把最后一个从A移到C,第三句又是把所有的从B移到C。函数本身参数是定死的,但是那三个参数却可以代表不同的真实的具体哪个柱子上的盘子进行移动,而参数的位置代表的是移动的思想。


总结

这两个问题是很好的递归问题,递归难就难在写出来简单,但是真正理解起来还是有一定的思考量的

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

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

相关文章

Shell的运行原理和Linux的权限

Shell的运行原理 Linux严格意义上说是一个操作系统,我们称之为“核心(kernel)”,但我们一般用户不能直接使用kernel,而是通过kernel的“外壳程序”,也就是所谓的Shell,来与kernel沟通。 Shell…

sql注入---sqli靶场

1.什么是SQL注入 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库 2.sql注入原理 攻击者注入一段包含注释符的SQL语…

SpringBoot整合Swagger,让开发更遍历

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ SpringBoot整合Swagger,让开发更遍…

Excel 将非分组列的数据移到同一行

例题描述和简单分析 有 Excel 数据如下所示: Account NameJoin DateOther ColumnsPackageAccount 12001/1/19DataMain PackageAccount 12001/1/19DataBolt OnAccount 12001/1/19DataAdd onAccount 22001/1/18DataMain PackageAccount 32001/1/17DataMain PackageA…

2024最新软件测试【测试理论+ Linux】面试题(内附答案)

一、测试理论 3.1 你们原来项目的测试流程是怎么样的? 我们的测试流程主要有三个阶段:需求了解分析、测试准备、测试执行。 1、需求了解分析阶段 我们的 SE 会把需求文档给我们自己先去了解一到两天这样,之后我们会有一个需求澄清会议, …

JDK 1.8 HashMap扩容机制

我们首先来看利用无参构造函数创建HashMap如何扩容。首先创建一个无参构造出来的hashmap HashMap hashMap new HashMap();该构造函数源码如下: public HashMap() {this.loadFactor DEFAULT_LOAD_FACTOR; // all other fields defaulted}此时,该构造函…

Shiro反序列化漏洞-Shiro550流程分析

Apache Shiro是一个开源框架,这个漏洞在2016就被披露了。Shiro框架使用广泛,漏洞影响范围广。 环境搭建 这里我使用的是IDEA 2023.3.5 环境下载 这里就不配图片了,具体操作可以搜索引擎 tomcat 8.5.76 下载地址: https://arc…

什么是抽样调查

抽样调查是政府统计工作和市场调查中普遍采用的方法,我国《统计法》中明确规定:搜集、整理统计资料,应当以周期性普查为基础,以经常性抽样调查为主体,综合运用全面调查、重点调查等方法,并充分利用行政记录…

ECMAScript 2024 新特性

ECMAScript 2024 新特性 ECMAScript 2024, the 15th edition, added facilities for resizing and transferring ArrayBuffers and SharedArrayBuffers; added a new RegExp /v flag for creating RegExps with more advanced features for working with sets of strings; and …

Peter算法小课堂—序列切割

讲序列切割之前,先来个铺垫 高手集训 题目描述: 课程表里有连续的n天可以供你选择,每天都有专题课程。其中第i天的专题趣味程度为h[i]。假设你选择了其中连续的若干天,从第l天到第r天。那么, 训练效果 h[l]*1 h[…

WS2812B是一个集控制电路与发光电路于一体的智能外控LED光源

产品概述 WS2812B是一个集控制电路与发光电路于一体的智能外控LED光源。其外型与一个5050LED灯珠相同,每个元件即为一个像素点。像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路,还包含有高精度的内部振荡器和可编程定电流控制部分&a…

神经网络复习--数学相关基础知识

文章目录 矩阵范数卷积激活函数信息熵 矩阵 标量:一个标量就是一个单独的数向量:一个向量是一列数。这些数是有序排列的。通过次序中的索引,我们可以确定每个单独的数矩阵:矩阵是一个二维数组,其中的每个元素被两个索…

2023年上半年信息系统项目管理师——综合知识真题与答案解释(4)

2023年上半年信息系统项目管理师 ——综合知识真题与答案解释(4) 61、文档的规范化管理主要体现在()方面。 ①文档书写规范 ②文档质量级别 ③图表编号规则 ④文档目录编写标准 ⑤文档管理制度 ⑥文档安全标准 A.①②③④ B.②③…

STM32使用ESP01S连接阿里云物联网平台

一、ESP01S烧录MQTT固件准备 首先准备好烧录工具,可以从官网上进行下载。 MQTT固件官网网址:AT固件汇总 | 安信可科技 (ai-thinker.com) 进去后如下图界面,向下翻找找到MQTT固件(1471)下载固件即可。 烧录工具光网地…

信号和槽基本概念

🐌博主主页:🐌​倔强的大蜗牛🐌​ 📚专栏分类:QT❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、概述 二、信号的本质 三、槽的本质 一、概述 在 Qt 中,用户和控件的每次交互过程称…

服务器端口怎么开,服务器端口的开放通常涉及的五个关键步骤

服务器端口的开放通常涉及五个关键步骤,包括修改防火墙规则、配置服务器软件以及验证端口是否开放。下面将详细介绍每个步骤。 一、您需要确定需要开放的端口。常见的服务器应用程序端口包括HTTP(80端口)、HTTPS(443端口&#xff…

掌握这个Jenkins插件,离测试开发又近一步!

Jenkins Pipeline是一种可编程的、可扩展的持续交付管道,允许您使用脚本来定义整个软件交付过程。 以下是使用Jenkins Pipeline创建和配置流水线的基本步骤。 Part 01. 创建一个Pipeline Job 在Jenkins中创建一个新的"Pipeline"类型的Job。 以下是在J…

李开复引领的零一万物开源了Yi-1.5模型,推出了6B、9B、34B三个不同规模的版本

零一万物,由李开复博士引领的AI 2.0公司,近期开源了其备受瞩目的Yi-1.5模型,这一举措再次彰显了公司在人工智能领域的创新实力与开放精神。Yi-1.5模型作为零一万物的重要技术成果,不仅代表了公司在大模型技术研发上的新高度&#…

下载npm I就包错解决方案

npm i xxxx -S --legacy-peer-deps 如果包错就执行以上命令

聚类分析 | 基于GA遗传算法优化kmeans聚类(Matlab)

聚类分析 | 基于GA遗传算法优化kmeans聚类(Matlab) 目录 聚类分析 | 基于GA遗传算法优化kmeans聚类(Matlab)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 GA-kmeans聚类算法,通过GA遗传算法优化kmeans聚类&…