【C语言】递归解决经典题目(汉诺塔问题、青蛙跳台阶问题)

news2024/10/7 20:29:51

简单不先于复杂,而是在复杂之后。

89efcc89ac61428db4d5b6639b2bd948.jpeg

目录

1. 汉诺塔问题 

1.1 简介及思路

1.2 代码实现

2. 青蛙跳台阶问题 

2.1 简介及思路 

2.2 代码实现 


1. 汉诺塔问题 

1.1 简介及思路

汉诺塔问题是一种经典的递归问题,起源于印度传说中的塔 of Brahma。问题描述如下:

有三个柱子A、B、C,A柱子上有n个盘子,这些盘子大小不一,且从上到下依次变大,现在需要将A柱子上的盘子全部移动到C柱子上,移动的过程中必须满足以下三个条件:

  1. 每次只能移动一个盘子;
  2. 盘子可以移动到任意柱子上,但是必须保证较大的盘子不能放在较小的盘子上面;
  3. 每个盘子移动的过程中都必须放在柱子的顶端。

问题的目标是用最少的步数将所有盘子从A柱子移动到C柱子。

汉诺塔问题可以通过递归的方式解决。

假设有n个盘子需要从A柱子移动到C柱子上,我们可以把这个问题分解成三个子问题:

  1. 将n-1个盘子从A柱子移动到B柱子上;
  2. 将最大的盘子从A柱子移动到C柱子上;
  3. 将n-1个盘子从B柱子移动到C柱子上。

这样,我们可以使用递归算法解决汉诺塔问题。

 

1.2 代码实现

 假如 n 的值为3的话,操作如下:

 

 

 

 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

void hannoi(int n, char A, char B, char C)
{
	static int count = 1;//count用来计步数,将其变为静态变量以保留count的值
	if (n == 1)
	{
		printf("第%d步:%c -> %c\n",count++, A, C);
		return;
	}
	hannoi(n - 1, A, C, B);
	printf("第%d步:%c -> %c\n", count++, A, C);
	hannoi(n - 1, B, A, C);
}

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

	return 0;
}

用归纳法的思想来思考,先考虑盘子只有三个的情况,首先要把A的最上面的盘子移到C,所以在满足限制条件时第一次操作就应该是把A的最上面的盘子移到C,写成 if 语句,括号中的限制条件就是 n == 1 的情况,因为递归的核心就是大事化小,n个盘子的问题可以化解成n-1个盘子加上一个盘子的问题。

倒着思考的话,满足限制条件进行第一步操作时一定是已经‘递’完的情况了,要开始‘归’了,那么应该返回上一级函数,所以在 if 语句中应当加一个 return; 

既然是递归就一定要自己调用自己,所以在 if 语句后面写一个 hanoi 函数,第一个参数是

n-1, 递归中所执行的操作要尽量统一,所以这个函数后面的 printf 语句和 if 中的保持一致。

但是我们现在假设三个盘子的情况,应该把A上的盘子放到B上了,printf 语句中还是

A -> C,所以把参数B和C互换一下就好了。

在第三步要让C -> B,还需要调用一次函数,在这一层B和C已经互换了,所以传参顺序应为‘B’‘A’‘C’。

将程序运行,输入3,和以上画图推理的吻合,也可以用其他的值来测试,程序正确。

2. 青蛙跳台阶问题 

2.1 简介及思路 

这个游戏是这样的:

一只青蛙,一次可以跳一或两个台阶,求青蛙跳 n 个台阶有多少种跳法。 

对于青蛙跳上第 n 个台阶,有两种情况:

  1. 青蛙从第 n-1 个台阶跳上来;
  2. 青蛙从第 n-2 个台阶跳上来。

因为青蛙每次可以跳一步或两步,所以到达第 n-1 个台阶只有一种跳法,到达第 n-2 个台阶也只有一种跳法。

设跳上第 n 个台阶的跳法数为 f(n),则有:

f(n) = f(n-1) + f(n-2)

这是一个典型的斐波那契数列,可以使用递归来实现。

2.2 代码实现 

 

 

下附代码,可供大家自行测试。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int jump(int n)
{
	if (n <= 2)
		return 1;
	else
		return jump(n - 1) + jump(n - 2);
}

int main()
{
	int n;
	scanf("%d", &n);
	printf("青蛙跳到第%d个台阶有%d种跳法", n, jump(n));

	return 0;
}

 

 

 

 

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

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

相关文章

手把手教你学习IEC104协议和编程实现 十 故障事件与复位进程

故障事件 目的 在IEC104普遍应用之前,据我了解多个协议,再综合自动化协议中,有这么一个概念叫“事故追忆”,意思是当变电站出现事故的时候,不但要记录事故的时间,还需记录事故前后模拟量的数据,从而能从一定程度上分析事故产生的原因,这个模拟量就是和今天讲解的故障…

silvaco 仿真BJT

本次实验为利用silvaco仿真BJT器件&#xff0c;分析不同p区厚度以及p区不同掺杂浓度研究其电流增益的变化。 一、器件要求 区域 掺杂方式 掺杂浓度或 峰值浓度&#xff08;/cm3&#xff09; 厚度&#xff08;um&#xff09; 宽度&#xff08;um&#xff09; N-漂移区 均匀…

微服务框架【笔记-Nacos注册中心】

接上篇&#xff0c;继续学习微服务框架中的Nacos注册中心。 Nacos注册中心 一、认识和安装Nacos 1.认识Nacos Nacos 是阿里巴巴的产品&#xff0c;现在是 SpringCloud 中的一个组件。相比 Eureka 功能更加丰富。 2.安装Nacos 下面给大家展示windows安装Nacos步骤&#xff1a;…

网络互联技术与实践教程(汪双硕、姚羽)——第四章 路由技术

第四章 路由技术 4.1 路由原理 路由是指通过相互连接的网络将数据从源地点转发到目标地点的过程。在路由过程中&#xff0c;数据通常会经过一个或多个中间节点&#xff0c;路由发生在网络层。路由包含两个主要的动作&#xff1a;确定最佳路径和通过网络传输信息&#xff0c;后…

刷题笔记【6】| 快速刷完67道剑指offer(Java版)

本文已收录于专栏&#x1f33b;《刷题笔记》文章目录前言&#x1f3a8; 1、包含min函数的栈题目描述思路&#xff08;双栈法&#xff09;&#x1f3a8; 2、栈的压入弹出序列题目描述思路&#xff08;辅助栈&#xff09;&#x1f3a8; 3、从上往下打印二叉树题目描述思路&#x…

chapter-4-数据库语句

以下课程来源于MOOC学习—原课程请见&#xff1a;数据库原理与应用 考研复习 概述 SQL发展 注&#xff1a;关键词是哪些功能&#xff0c;尤其第一个create alter drop是定义功能 1.SQL功能强大&#xff0c;实现了数据定义、数据操纵、数据控制等功能 2.SQL语言简洁&#xff…

【Java版oj】day26跳台阶扩展问题、快到碗里来

目录 一、跳台阶扩展问题 &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代码 二、快到碗里来 &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代码 一、跳台…

tomcat配置虚拟路径映射磁盘文件列表图片回显和放大功能实现springboot项目的文件虚拟路径映射

tomcat映射磁盘图片1.以E盘为例&#xff0c;在E盘创建目录testReceive2.配置tomcat虚拟路径映射e盘本地文件3.代码层面创建上传文件&#xff08;此处为图片&#xff09;工具类3.1&#xff08;校验图片格式、获取当前主机ip、上传图片至本机目的地&#xff0c;获取上传图片地址&…

javaWeb(HTTP、Tomcat、Servlet)

目录 HTTP Web 服务器 - Tomcat 简介 基本使用&#xff1a;下载、安装、卸载、启动、关闭、配置、部署项目 IDEA中创建 Maven Web项目​编辑 IDEA中使用 Tomcat Servlet 快速入门 Servlet 执行流程 Servlet 生命周期 Servlet 体系结构 Servlet urlPattern配置 XM…

【从零开始学Skynet】实战篇《球球大作战》(五):gateway代码设计(中)

1、编码和解码 我们来实现两个辅助方法str_unpack和str_pack&#xff0c;用于消息的解码和编码。 &#xff08;1&#xff09;str_unpack代码 local str_unpack function(msgstr)local msg {}while true dolocal arg, rest string.match( msgstr, "(.-),(.*)")if…

【web自动化测试】

文章目录web自动化测试第一章 web自动化入门1.什么是自动化&#xff1f;1.1 优点2.什么是自动化测试&#xff1f;2.1 自动化测试能解决什么问题&#xff1f;2.2 自动化相关知识2.2.1优点2.2.2 误区2.3 自动化测试分类3.什么是Web自动化测试&#xff1f;3.1 什么Web项目适合做自…

Flutter 了解 Element

一 Element 概念 这个玩意的概念。到底是什么 &#xff1f; 官方解释是在树中特定位置的实例。 二 继承关系 element 有 ComponentElement 和 RenderObjectElement 之分 1 ComponentElement class StatelessElement extends ComponentElement class StatefulElement extend…

计及调度经济性的光热电站储热容量配置方法

目录 1 主要内容 目标函数 光热电站能量传递过程 2 部分程序 3 程序结果 4 程序链接 1 主要内容 该程序复现《计及调度经济性的光热电站储热容量配置方法》模型&#xff0c;综合考虑火电机组发电成本、光热发电并网消纳的环境效益和运行维护成本、系统旋转备用成本等调度…

rk3568点亮LCD(RGB)

rk3568 Android11/12 调试 RGB 屏 RGB一般是指RGB色彩模型(RGB color model)&#xff0c;是工业界的一种颜色标准。RGB接口占用的资源较多&#xff0c;所以这个接口的LCD刷新率非常快&#xff0c;软件控制也比较简单。缺点是控制需要增加电路&#xff0c;软件初始化需要增加程…

【BOM浏览器对象模型】

BOM浏览器对象模型1 本节目标2 BOM概述3 window对象的常见事件3.1 窗口加载事件3.2 调整窗口大小事件4 定时器4.1 两种定时器4.2 setTimeout()定时器4.3 停止setTimeout()定时器4.4 setInterval()定时器4.5 停止setInterval()定时器4.6 this指向问题5 JS执行队列5.1 JS是单线程…

BUUCTF-.htaccess-sql.fuzz-D盾

第七周第一次 目录 WEB [MRCTF2020]你传你&#x1f40e;呢 ​编辑 [极客大挑战 2019]HardSQL Crypto 萌萌哒的八戒 传统知识古典密码 Misc 假如给我三天光明 后门查杀 WEB [MRCTF2020]你传你&#x1f40e;呢 文件上传 我们进行尝试 设置一个 1.jpg的一句话木马 G…

RabbitMQ之高级特性

文章目录一、消息确认机制&#x1f389;1.1 消息发送确认(生产者)&#x1f539;confirm 确认模式&#x1f539;return 回退模式&#x1f6a9;1.2 消息接收确认(消费者)&#x1f538;none 自动确认&#x1f538;auto 异常确认&#x1f538;manual 手动确认二、消费端限流 (prefe…

创略科技联合创始人兼总裁杨辰韵:AIGC、隐私计算赋能数字营销的本质是“以客户为中心”丨数据猿专访...

‍数据智能产业创新服务媒体——聚焦数智 改变商业MarTech概念现身已超十年&#xff0c;伴随着企业数字化转型的大背景&#xff0c;中国MarTech市场也迎来了高速发展。据《2022年中国MarTech市场洞察报告》数据显示&#xff0c;2017-2021年&#xff0c;中国 MarTech产业规模从…

H264码流中 SPS PPS SEI 详解

1 客户端抓包 在做客户端视频解码时&#xff0c;一般都会使用Wireshark抓包工具对接收的H264码流进行分析&#xff0c;如下所示&#xff1a; 在这里我们可以看到对解码视频起关键作用的SPS和PPS。 2、双击SPS内容如下&#xff1a; 那么从上面的sps中我们知道图像的宽&#x…

【从零开始学Skynet】实战篇《球球大作战》(二):结构设计

万丈高楼平地起&#xff0c;既然这是个“大项目”&#xff0c;就要有大项目的样子&#xff0c;就要有所规划&#xff0c;下面先把项目的目录结构搭起来。 1、目录结构 建议把Skynet框架放到一个文件夹里&#xff0c;把所有自己编写的内容都放到外层的文件夹里。建立如下表所示的…