函数递归详解

news2024/12/24 3:19:42

前言:

函数递归是一种算法,递归是通过将问题分解为更小的子问题来解决问题的办法,递归的优点如下:

  • 简洁性:递归可以用较少的代码实现复杂的功能
  • 灵活性:递归可以应对未知深度的数据结构,因为它不需要提前知道要处理的嵌套层级

什么是递归?

递归程序调用自身的编程技巧称为递归

  • 从调用自身的层面:函数递归就是自己调用自己
  • 从编程技巧层面:一种方法(它通常将一个大型复杂问题层层转化为一个与原问题相似的规模较小的问题来求解,简化程序的代码量),这种方法的主要思想为:将大事化小

史上最简单的递归:

int main()
{
	printf("hehe\n");

	main();

	return 0;
}

 main()函数内部调用了main()函数,产生的现象为程序死递归,导致栈溢出(stack overflow);

递归的两个必要条件

  1. 存在限制条件,当满足这个限制条件的时候,递归便不再继续;
  2. 每次递归调用之后越来越接近这个限制条件;

递归的细节说明

  • 每一级递归都有自己的参数,参数形式可能相同,但是其值不同

函数调用之前,操作系统会为其分配函数栈帧,从而保留函数调用时当前函数的参数

  • 每一次函数调用结束都要返回值,当递归执行结束后,控制权转回到上一级函数

当递归的最后一层执行结束,系统释放最后一次递归调用所开辟的空间,同时返回到上一级函数调用,接着向下执行程序,当上一级递归结束,系统继续释放该级调用的函数栈帧,按此循环,直至系统回收主函数所开辟的函数栈帧为止;

  • 函数中递归语句之前的代码,按被调函数的顺序执行,递归之后的代码,与被调函数相反的顺序执行

递归示例

示例1:

接受一个整型值(无符号),按照顺序打印它的每一位

输入:1234           输出:1 2 3 4

思路:

假设定义print()函数,其功能为按照顺序打印每一位

print(1234)即打印1 2 3 4

print(123)  4 按照顺序打印1 2 3,最后打印4;

print(12)   3  按照顺序打印1 2 ,最后打印3;

printf(1)    2  打印1,最后打印2;

当位数只有一位时,不需要进行拆分,直接打印;

//只需要打印,不需要返回值
void print(unsigned int x)
{
	if (x > 9)
	{
		print(x / 10);//剥离n位数的前n-1位
	}
	printf("%d ", x % 10);//打印最后一位
}
int main()
{
	unsigned int num = 0;
	scanf("%d", &num);
	print(num);
	return 0;
}

运行结果:

画图分析:程序执行过程如箭头所示

示例2:

  • 求字符串长度
int my_strlen(char* s)
{
	int count = 0;
	while (*s != '\0')
	{
		count++;
		s++;
	}
	return count;
}
int main()
{
	char arr[] = "abc";
	int len = my_strlen(arr);
	printf("%d\n", len);
	return 0;
}
  • 编写函数不允许创建临时变量,求字符串长度

思路:

假设my_strlen()函数可以求字符串长度,参数为字符指针

传参时需要传址,对字符地址进行解引用操作,如果第一个字符就是'\0',长度为0

如果第一个字符不是'\0',长度为1+my_strlen()函数;

例如:

my_strlen("abc")

1+my_strlen("bc")

1+1+my_strlen("c")

1+1+1+my_strlen("")

int my_strlen(char* s)
{

	if (*s == '\0')
		return 0;
	else
		return 1 + my_strlen(s + 1);
}
int main()
{
	char arr[] = "abc";
	int len = my_strlen(arr);
	printf("%d\n", len);
	return 0;
}

   示例3:

  • 求第n个斐波那契数

思路:

斐波那契数列:1  1   2   3    5    8   13   21   34    55  ......

斐波那契数的特点前两个数的和等于第三个数

 公式:

     当n<=2时,   Fib(n)=  1

     当n>2时,     Fib(n)= Fib(n-1)+Fib(n-2)

//递归解法
int Fib(int n)
{
	if (n <= 2)
		return 1;
	else
		return Fib(n - 1) + Fib(n - 2);
}

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

 递归的方式求解斐波那契数存在大量重复的计算,导致性能下降,效率低下,解决方案:

采用非递归方式求解

思路:

利用斐波那契数的特点,前两个斐波那契数不用计算

a=1 b=1 c=a+b=2

a=b=1  b=c=2 c=a+b=1+2=3

a=b=2   b=c=3  c=a+b=5

......

//迭代解法
//前两个斐波那契数不用计算,计算第n个斐波那契数即程序执行n-2次
int Fib(int n)
{
	int a = 1;
	int b = 1;
	int c = 1;

	while (n >= 3)
	{
		c = a + b;
		a = b;
		b = c;

		n--;
	}
	return c;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = Fib(n);
	printf("%d\n", ret);
	return 0;
}

 

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

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

相关文章

Spring MVC 中的数据绑定和验证机制是什么,如何使用

在 Spring MVC 应用中&#xff0c;数据绑定和验证是非常重要的一部分&#xff0c;它们可以帮助我们将用户提交的数据绑定到 Java 对象上&#xff0c;并对数据进行验证&#xff0c;保证数据的正确性和可靠性。在 Spring MVC 中&#xff0c;数据绑定和验证机制都是通过注解来实现…

Unity 课时 4 : No.4 模拟面试题

课时 4 : No.4 模拟面试题 C# 1. 请说明字符串中 string str null string str “” string str string.Empty 三者的区别 第一个未作初始化没有值, 第二个为空字符串, 答案&#xff1a; str null 在堆中没有分配内存地址 str "" 和 string.Empty 一样都是…

CentOS7 yum安装报错:“Could not resolve host: mirrorlist.centos.org; Unknown error“

虚拟机通过yum安装东西的时候弹出这个错误&#xff1a; 1、查看安装在本机的网卡 网卡ens33处于disconnected的状态 nmcli d2、输入命令&#xff1a; nmtui3、选择网卡&#xff0c;然后点击edit 4、移动到Automatically connect按空格键选择&#xff0c;然后移动到OK键按空格…

Win7 IIS7解析漏洞复现

一、漏洞说明 文件上传使用白名单做限制&#xff0c;只能上传图片文件&#xff0c;导致脚本文件无法上传&#xff0c;上传图片马绕过白名单文件上传的验证&#xff0c;但是图片马又无法解析&#xff0c;利用IIS7.5文件解析漏洞的特点&#xff1a;任意文件名/任意文件名.php&…

华为云云耀云服务器L实例评测 | Linux系统宝塔运维部署H5游戏

文章目录 前言一、云服务器相对传统服务器有什么优势1.1、可伸缩性&#xff08;Scalability&#xff09;1.2、灵活性&#xff08;Flexibility&#xff09;1.3、高可用性&#xff08;High Availability&#xff09;1.4、备份和恢复&#xff08;Backup and Recovery&#xff09;1…

SVN学习笔记--如何 Merge 分支?保姆级教学,带图片手把手实操。

目录 前言实例具体步骤总结 前言 由于项目中有多个分支&#xff0c;如果修改了一处代码&#xff0c;可能需要保证分支和主分支代码一样&#xff0c;所以需要利用 SVN Merge 代码。 实例 现在有两个分支 一个 trunk&#xff1a;主分支一个 develop&#xff1a;开发分支 我们…

数学实验-迭代(Mathematica实现)

一、实验名称&#xff1a;迭代 二、实验环境&#xff1a;Mathematica 10.3软件 三、实验目的&#xff1a;本实验通过Mathematica 10.3软件利用迭代求解方程的近似解&#xff0c;了解迭代方法在解决问题的收敛速度的异同&#xff0c;认识到函数的迭代是数学研究中的一个非常重…

PHPword setImageValue 设置高度不生效

phpword 版本 "phpoffice/phpword": "^0.18.3 我正在使用这个代码&#xff0c;使用模板&#xff0c;写入动态图片&#xff0c;但问题是图像的大小太小&#xff0c;我需要增加高度和宽度 模板文件 如下 问题写法&#xff1a; $file_name "简历";…

UWB学习——day4

UWB学习——day4 技术劣势技术细节UWB频段系统调制方式UWB帧结构芯片实例 技术劣势 干扰其它技术&#xff0c;UWB技术目前允许在未授权的3.1 GHz至10.6 GHz频谱上运行&#xff0c;但该频谱上有许多其它无线通讯所在的频带&#xff0c;容易互相产生干扰&#xff0c;反而限制了适…

基因型数据VCF转EXCEL亲测好用

import pandas as pd df pd.read_csv(shuju.vcf, sep\t, comment#, headerNone,encodingutf-8) df.to_excel(outputFile2.xlsx, indexFalse,encodingutf-8) 以上就是转成功的截图&#xff0c;需要注意的是一定要写入编码方式&#xff0c;UTF-8 &#xff0c;第一次我没有写编码…

实景无人直播系统哪个最好用?呆头鹅无人直播系统

软件图片素材来自于公众号&#xff1a;生财风暴 关注进行领取价值1000元的采集软件&#xff0c;和呆头鹅批量剪辑和矩阵管理系统演示 在未来&#xff0c;想要低成本在人工智能领域创业&#xff0c;其实很简单&#xff0c;如果你是想要低成本创业的人&#xff0c;那么请一定要把…

leetcode 1222. 可以攻击国王的皇后(每日一题)

1222. 可以攻击国王的皇后 在一个 8x8 的棋盘上&#xff0c;放置着若干「黑皇后」和一个「白国王」。 给定一个由整数坐标组成的数组 queens &#xff0c;表示黑皇后的位置&#xff1b;以及一对坐标 king &#xff0c;表示白国王的位置&#xff0c;返回所有可以攻击国王的皇后的…

pcl--第三节 关键点

简介 关键点也称为兴趣点&#xff0c;它是 2D 图像或 3D 点云或曲面模型上,可以通过检测标准来获取的具有稳定性、区别性的点集。从技术上来说,关键点的数量比原始点云或图像的数据量少很多&#xff0c;其与局部特征描述子结合组成关键点描述子。常用来构成原始数据的紧凑表示…

Furion api npm web vue混合开发

Furion api npm web vue混合开发 Furion-api项目获取swagger.json文件复制json制作ts包删除非.ts文件上传到npm获取npm包引用 Furion-api项目获取swagger.json文件 使用所有接口合并的配置文件 复制json制作ts包 https://editor.swagger.io 得到 typescript-axios-clien…

封面人物 | 贾楠:向中介费全面开炮

古人云&#xff0c;燕赵之地多慷慨豪侠之士。贾楠便是一个将豪迈的破局精神融入诸多创意项目的探路者&#xff0c;以及醉心于诗意人生的思考者。 上世纪90年代&#xff0c;他曾尾随南下大军在海南淘得第一桶金。之后&#xff0c;贾楠涉足影视投资&#xff0c;投身健康产业……所…

软件测试如何制作一份亮眼的简历?

简历是入职职场的一张名片&#xff0c;也是进入职场的一块“敲门砖”。从某种角度说&#xff0c;简历也是一张专业人员的说明书。 在互联网行业&#xff0c;如果你在一线企业任职、是业内大佬、技术大牛&#xff0c;基本上大把的高薪工作等你来挑。但是对于转行的小白来说&…

【产品实习评审】对推电影项目核心推荐功能的交互设计比较到位

大家好&#xff0c;本篇文章分享【校招VIP】免费商业项目“推电影”第一期电影详情模块产品同学的原型图周最佳作品。该同学来【莱顿大学】“数学”专业。 1、本项目是基于年轻人的喜好&#xff0c;更个性的电影推荐网站。筛选各分类的知名电影&#xff0c;并给出推荐理由和下…

Python in Visual Studio Code 2023年9月更新

作者&#xff1a;Courtney Webster - Program Manager, Python Extension in Visual Studio Code 排版&#xff1a;Alan Wang 我们很高兴地宣布 Visual Studio Code 的 Python 和 Jupyter 扩展将于 2023 年 9 月发布&#xff01; 此版本包括以下内容&#xff1a; • 将 Python …

2023/9/14 -- C++/QT

作业&#xff1a; 仿照Vector实现MyVector&#xff0c;最主要实现二倍扩容 #include <iostream>using namespace std;template <typename T> class MyVector { private:T *data;size_t size;size_t V_capacity; public://无参构造MyVector():data(nullptr),size(…

数据结构ArrayList

ArrayList的顶级理解 1.ArrayList的简介2.ArrayList的使用3.ArrayList的构造4.ArrayList常见操作5.ArraList的遍历5.1 普通for循环5.2 增强for循环5.3 迭代器循环 6.ArrayList的扩容机制 1.ArrayList的简介 ***ArrayList是以泛型方式实现的&#xff0c;使用时必须要先实例化Arr…