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

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

个人主页: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.mfbz.cn/a/610699.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ansys界面设计:ACT入门

来自官方文档Getting Started with ACT,机翻。 Ansys 提供一流的现成仿真技术。为了最有效地部署普遍模拟,您可能需要更精心策划的体验,以使我们的模拟专业知识与您的用户、公司或行业需求相匹配。 Ansys ACT 使您能够自定义和扩展 Ansys 体验…

java注解全网最细

引言 在java编程中,注解(Annotation)是一种元数据,它提供了关于程序代码的额外信息。注解不直接影响程序的执行,但可以在运行时提供有关程序的信息,或者让编译器执行额外的检查。 下面笔者通过循序渐进的…

快速上手文心一言指令

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…

PHP基础教程

🐌博主主页:🐌​倔强的大蜗牛🐌​ 📚专栏分类:PHP 📚参考教程:菜鸟\编程网❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、PHP语法 基本的 PHP 语法 PHP 注释 PHP空白不敏…

Kafka分级存储概念(一)

Kafka分级存储及实现原理 概述 Kafka社区在3.6版本引入了一个十分重要的特性: 分级存储,本系列文章主要旨在介绍Kafka分级存储的设计理念、设计细节以及具体的代码实现 背景:为什么要有分级存储? 场景 作为一款具有高吞吐及高性能的消息中间件,Kafka被广泛应用在大数据、…

Linux添加IP地址的方法

1.nmcli:命令式的添加IP地址 [rootlocalhost ~]#nmcli connection modify eno16777736 ipv4.addresses 192.168.126.100/24 ipv4.gateway 192.168.126.1 ipv4.method manual connection.autoconnect yes [rootlocalhost ~]# nmcli connection modify eno16777736 i…

Spring Cloud Alibaba Sentinel 集成与限流实战(6)

项目的源码地址 Spring Cloud Alibaba 工程搭建(1) Spring Cloud Alibaba 工程搭建连接数据库(2) Spring Cloud Alibaba 集成 nacos 以及整合 Ribbon 与 Feign 实现负载调用(3) Spring Cloud Alibaba Ribbo…

RFID在汽车制造中的应用如何改变行业

随着工业4.0和中国制造2025的推进,企业对于智能化、自动化的需求日益增长,RFID射频技术在制造业中已经相当普遍了。在如今这瞬息万变的行业与时代中,RFID技术可以帮助企业获得竞争优势,简化日益复杂的生产流程,推动企业…

*args和**kwargs的使用

*args传入的是按照顺序的不定长度的参数列表 **kwargs传入的是不定长度的键值对

AI 资料汇总专栏

包含AI资料、大模型资料、AI最新行业发展 人工智能(Artificial Intelligence,简称AI)是一门研究如何使计算机能够具备智能行为的科学与技术。它致力于开发出能够像人类一样思考、学习、理解和决策的计算机系统。自20世纪50年代以来&#xff…

《第一行代码》第二版学习笔记(11)——最佳的UI体验

文章目录 一、Toolbar二、滑动菜单1、DrawerLayout——抽屉2、NavigationView 三、悬浮按钮和可交互提示1、FloatingActionButton——悬浮按钮2、Snackbar——提示工具3、CoordinatorLayout 四、卡片式布局1、cardView2、AppBarLayout 五、下拉刷新——SwipeRefreshLayout六、可…

栈与递归的实现

1. 栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。 栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则&#x…

教你解决PUBG绝地求生登不进去 无法进入游戏 启动很慢的问题

尽管《绝地求生》(PUBG)以它那扣人心弦的战术竞技和逼真模拟的战场氛围风靡全球,揽获无数玩家的喜爱,但一些玩家在经历了一场血脉喷张的生存较量后,却不得不面对一个不那么愉悦的后续:游戏在结算阶段后出现…

docker学习笔记(五):harbor仓库搭建与简单应用

harbor私有仓库 简介 Docker容器应用的开发和运行离不开可靠的镜像管理,虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署私有环境内的Registry也是非常必要的。Harbor是由VMware公司开源的企业级的Docker Registry管…

文献速递:深度学习医学影像心脏疾病检测与诊断--基于迁移学习的生成对抗网络用于静态和动态心脏PET的衰减校正

Title 题目 Transfer learning‑based attenuation correction for static and dynamic cardiac PET using a generative adversarial network 基于迁移学习的生成对抗网络用于静态和动态心脏PET的衰减校正 01 文献速递介绍 心脏正电子发射断层扫描(PET&#xf…

JAVA入门1.1.0

前言: 不一样的编程——基于两个大前提,语言随便选一个,作者选java和c,在后续的内容会有c和java的共同使用 第一大前提:编程语言起源于语言 第二大前提:计算机理解不了语言的含义 这两大前提构成了不一样的…

Word设置代码块格式

前言 Word中无法像Markdown和LaTeX一样插入代码块,若要在Word中插入代码块可以手动设置代码块格式或自动粘贴代码块格式。若不追求完美高亮效果,可使用前者方案;若追求完美的高亮效果,可使用后者方案。下文介绍这2种方案。 手动…

渲染农场评测:6大热门云渲染平台全面比较

在3D行业中,选择一个合适的云渲染平台可能会令许多专业人士感到难以抉择。为此,我们精心准备了6家流行云渲染平台的详尽评测,旨在为您的决策过程提供实用的参考和支持。 目前,市面上主要的3D网络渲染平台包括六大服务商&#xff0…

SQL编程

用户变量的语法使用 #MySQL变量的定义与使用 #一、标识符命名规范 #1、字母加数字,但不允许使用数字开头 #2、不允许使用关键字或保留字 #3、符号只可以使用“_”或“$" #二、变量的声明 #set用于声明变量,update声明修改的表,set是声明…

OpenGL入门第三步:矩阵变换、坐标系统

1、矩阵变换 这里矩阵变换,使用4*4的矩阵,既可以表示位移,也可以表示缩放。 原因: 添加4维矩阵变量 initializeGL()函数:在着色器里面添加变换矩阵,改变坐标位置 设计一个随时间变换 ,所有重写TimerEvent 调用update触发paintGL()函数: 2、坐标系统
最新文章