【C语言】递归经典题型_递归编程题-程序员宅基地

技术标签: 算法  c++  C语言  c语言  

  • 求第 n 个斐波那契数。(不考虑溢出)
int fib(int n)
{
	if (n <= 2)
	{
		return 1;
	}
	return fib(n - 1) + fib(n - 2);
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	printf("%d\n", fib(n));
}
  • 青蛙跳台阶问题 

【简介】一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法?

#include <stdio.h>

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

int main()
{
	int n = 0;
	scanf("%d", &n);
	printf("%d\n", frog(n));
	return 0;
}
  • 青蛙跳台阶问题的衍生变种

​​​​​​​【简介】一只青蛙一次可以跳上1级台阶,可以跳上2级台阶,也可以跳上3级。求该青蛙跳上一个n级的台阶总共有多少种跳法?

#include <stdio.h>

int frog(int n)
{
	if (n == 1)
	{
		return 1;
	}
	else if (n == 2)
	{
		return 2;
	}
	else if (n == 3)
	{
		return 4;
	}
	else
	{
		return frog(n - 1) + frog(n - 2) + frog(n - 3);
	}
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	printf("%d\n", frog(n));
	return 0;
}

【注】若把题目条件改成青蛙一次可跳m级阶梯,我们只需计算出从1级到m级的所需步数,除此之外,只需使用递归即可。

  •  汉诺塔问题

【简介】汉诺塔问题,是心理学实验研究常用的任务之一。该问题的主要材料包括三根高度相同的柱子和一些大小及颜色不同的圆盘,三根柱子分别为起始柱A、辅助柱B及目标柱C。

【来源及应用】相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。 下面给出两种简单情况的动态演示:

【思考逻辑】图解,不是按照步骤来的,从左到右依次为a,b,c三个柱子。汉诺塔永远只有三步:

  1. 把冰箱打开:将上面(n-1)看成一个整体,移动b柱。
  2. 把大象装进去:将a柱底盘移到c柱
  3. 把冰箱门关上:将b柱上的(n-1)移到c柱

【代码实现】

#include <stdio.h>
int count = 0;
void move(char a, char c,int n)
{
	printf("第%d个盘子:%c->%c\n",n, a, c);//从起始柱到目标柱
    printf("%d\n",++count);//次数
}

void Hanoi(char a, char b, char c, int n)
{
	if (n == 1)
	{
		move(a, c,n);
	}
	else
	{
		Hanoi(a, c, b, n - 1);//将n-1的盘子从起始柱A通过中转柱C移动到目标柱B
		move(a, c, n);//将底盘从起始柱A直接移动到目标柱C
		Hanoi(b, a, c, n - 1);//将n-1的盘子从起始柱B通过中转柱A移动到目标柱C
	}
	
}

int main()
{
	int n = 0;

	printf("请输入圆盘个数\n");//有 A B C三个支柱
	scanf("%d", &n);
	//将n个盘子从初试柱A借助于中转柱B移动到目标柱C
	Hanoi('A', 'B', 'C', n);//A->起始柱,b->中转柱,c->目标柱

	return 0;
}


//非递归,求的是总次数,数学方法——递推公式
/*
#include <stdio.h>
#include <math.h>

int Hanoi(int n)
{
	return pow(2, n) - 1;
}


int main()
{
	int n = 0;
	scanf("%d", &n);
	printf("%d\n", Hanoi(n));
	return 0;
}
*/
  • 汉诺塔问题的衍生变种

​​​​​​​【规则】:注意:小圆盘始终放置在大圆盘上, 最小的两个圆盘是一样大小的

1.一次只能移动一个圆盘.

2.每个步骤都包括从一座塔中取出上部圆盘并将其放在另一座塔的顶部或空的柱子上.

3.不能将较大的圆盘放置在较小的圆盘上.

一般情况,一根柱子上有N个圆盘, 小圆盘始终放置在大圆盘上, 最小的两个圆盘是一样大小的

先考虑2个相同大小的圆盘, 共2次移动 ;

考虑3个圆盘, 共2+1+2=5次移动;

考虑4个圆盘, 共5+1+5=11次移动;

按照这个递推规律, 对于一般的, 一根柱子上有N个圆盘, 小圆盘始终放置在大圆盘上, 最小的两个圆盘是一样大小的, 那么

因此一般的通项公式是

 

#include <stdio.h>

int Hanoi_s(int n)
{
	if (n == 1)
		return 1;
	if (n == 2)
		return 2;
	return 2 * Hanoi_s(n - 1) + 1;
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	printf("%d\n", Hanoi_s(n));
	return 0;
}

​​​​​​​

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_59954106/article/details/127682704

智能推荐

20、NanoDet训练、测试 以及使用ncnn部署Jetson Nano 进行目标检测和串口数据转发-程序员宅基地

文章浏览阅读6.5k次,点赞7次,收藏59次。基本思想:最近想尝试一下nano 上部署nanodet,于是记录一下训练过程,手中有一份labelme标注的数据集,于是开始了一波操作~首先将图片和json数据集转成xml (https://blog.csdn.net/sxj731533730/article/details/90046780),然后将xml数据集转成voc;import sysimport osimport jsonimport xml.etree.ElementTree as ETfrom PIL import Im_nanodet

code::blocks + wxWidgets 2.8 在ubuntu 10.04下的安装-程序员宅基地

文章浏览阅读930次。code::blocks + wxWidgets 2.8 在ubuntu 10.04下的安装p { margin-bottom: 0.21cm; }1、首先安装必要组件代码:安装编译器 sudo apt-get install build-essential

用java Swing做的小游戏&quot;像素鸟&quot;_java swing小游戏-程序员宅基地

文章浏览阅读4.4k次,点赞10次,收藏38次。最终效果 整个项目都是基于swing实现的。窗是口将图片加载到JPanel面板,然后将面板添加到到JFrame窗口实现显示。这个类是选择几只像素鸟的类,也是main函数里执行的方法,代码有详细的注释,这里就不废话了public class select extends JPanel { /** * */ private static final long serialVersio..._java swing小游戏

三分钟教你读懂支票是什么_支票的原理是什么-程序员宅基地

文章浏览阅读8.7k次。三分钟教你读懂支票是什么支票1、支票的概念及特点支票:出票人签发的,委托办理支票存款业务的银行或其他金融机构在见票时无条件支付确定金额给收款人或持票人的票据。支票必填项:支票字样、确定的金额、出票日期、无条件支付委托、付款人名称、出票人签章。支票选填项:付款地、出票地。支票结算特点:(1)简便,手续_支票的原理是什么

山东工商学院 计算机科学与技术,实验中心-山东工商学院计算机科学与技术学院...-程序员宅基地

文章浏览阅读148次。计算机教学实验中心成立于1999年,隶属计算机科学与技术学院。实验中心现有软件、电子、网络、通信、大学生科技创新、AR技术研究所等41间实验室,实验面积5600平方米,固定资产3500万元,教(职)工26人。实验中心以先进精良的设备条件、整洁舒适的教学环境、科学严谨的管理方式为计算机科学与技术学院、信息与电子工程学院、管理科学与工程学院等学院的实验教学、课程设计、毕业设计等实践环节和全院计算机公共..._计算机科学与技术实验教学中心 山东

CUDA ERROR: device-side assert triggered at 问题及解决思路-程序员宅基地

文章浏览阅读10w+次,点赞45次,收藏82次。cuda errorRuntimeError: cuda runtime error (59) : device-side assert triggered at ...我之前还以为是因为GPU抽风了引发的BUG,所以第一次没有在意,直接又重新开始运行了一次,但是第二次就发现程序在同样的地方断掉了,这也就想起来我以前看到的一个博客,里面有句话的大概意思是这样的:每次都在同样的地方出错的..._cuda error: device-side assert triggered

随便推点

Vue简明实用教程(04)——事件处理_vue html里面如何直接写事件函数-程序员宅基地

文章浏览阅读1.1k次,点赞4次,收藏5次。在Vue中可非常便利地进行事件处理,例如:点击事件、鼠标悬停事件等。_vue html里面如何直接写事件函数

南京邮电大学离散数学实验一(求主析取和主合取范式)-程序员宅基地

文章浏览阅读4.5k次,点赞15次,收藏67次。南京邮电大学离散数学实验一(求主析取和主合取范式)_离散数学实验

{spring.cloud.client.ipAddress}_spring.cloud.client.ip-address-程序员宅基地

文章浏览阅读1.5w次,点赞2次,收藏5次。1.在springcloud中服务的 Instance ID 默认值是:${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id:${server.port}},也就是:主机名:应用名:应用端口。如图12.可以自定义:eureka.instance...._spring.cloud.client.ip-address

单目标跟踪OTB、VOT数据集介绍_otb数据集官网-程序员宅基地

文章浏览阅读2.1w次,点赞6次,收藏63次。OTB分为:OTB50和OTB100官方下载链接为:OTB官方数据集网站http://cvlab.hanyang.ac.kr/tracker_benchmark/datasets.html百度云链接:链接:https://pan.baidu.com/s/1Ck51d7OQ8w8BGcTL9UtopA提取码:jn0k复制这段内容后打开百度网盘手机App,操作更方便哦其中50和100,分别..._otb数据集官网

Xcode修改模拟器Simulator系统版本_xcode模拟器切换ios版本-程序员宅基地

文章浏览阅读5.1k次。从Xcode菜单栏里打开Xcode -&gt; Preferences -&gt; Components -&gt; Simulators,下载对应版本的模拟器。由于模拟器相关文件较大,下载时间较长,需要耐心等待,下载完成后,对应版本的模拟器前面的下载按钮就会变成下载完成的样式。点击Xcode菜单栏 Window -&gt; Devices,然后可以看到设备列表,然而在模拟器列表(..._xcode模拟器切换ios版本

chatgpt赋能python:Python如何分离CSV的列_python的csv拆列-程序员宅基地

文章浏览阅读270次。CSV文件是一种以逗号或其他分隔符分隔的文件格式,用于存储表格数据。它可以用任何文本编辑器打开,并且非常适合在电子表格程序(例如Microsoft Excel或Google Sheets)中打开和处理。CSV文件通常由一组记录组成,每条记录包含一个或多个字段。字段之间使用逗号或其他指定的分隔符分隔。CSV文件中的第一行通常包含列标题,这些标题描述了每个字段的含义。Jack,19,UK本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。_python的csv拆列

推荐文章

热门文章

相关标签