2024年C C++最全【C语言】玩转递归——学好递归,你需要掌握的知识,大厂C C++面试真题精选

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取


提示:以下是本篇文章正文内容

一、递归是什么?

先来看一下定义:

程序调用自身的编程技巧称为递归( recursion)。

简单来说,就是在一个函数里面调用函数自己本身。

举个例子:
用递归实现求第n个斐波那契数。

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

int main()
{
	//斐波那契数 1 1 2 3 5 8 13 21 34 51....,除前两位外,后一个数的值等于前两位相加
	int n = 0;
	printf("请输入你要查找的斐波那契数:");
	scanf("%d", &n);
	int ret=Fib(n);
	printf("你好,你要需要的值是:%d\n", ret);
	return 0;
}

在这里插入图片描述所以,我们可以看到,所谓递归,其实就是一个函数里面调用函数自己本身。具体怎样调用的,我们下面再讲。

二、 递归的两个必要条件

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

分析之后,我们可以得出两个点

1、结束条件
2、逼近条件

我们在使用递归的时候,需要满足这两个条件。

总结起来四个字——大事化小

继续举斐波那契数的例子:

在这里插入图片描述

三、递归是怎样运行的

我们通过一道题目来讲解。

题目: 递归实现n的k次方
内容: 编写一个函数实现n的k次方,使用递归实现。

【解决思路】
运用递归思路,我们只要找到递归结束条件和逼近条件。通过分析,我们可以画出下面这幅图。

在这里插入图片描述

【代码实现】

#include <stdio.h>
double power(int n,int k)
{
	if (k< 0)
	{
		k = -k;
		return 1 / (n\*power(n, k - 1));
	}
	else if (k == 0)
		return 1;
	else if (k>0)
	{
		return n \* power(n, k - 1);
	}
}
int main()
{
	int n = 0;
	int k = 0;
	printf("请输入一个整数:");
	scanf("%d", &n);
	printf("请输入要求的次方数:");
	scanf("%d", &k);
	double ret=power(n,k);
	printf("%1f\n", ret);
	return 0;
}

【画图详解递归思路】

请添加图片描述通过图解,发现思路,我们** 存在限制条件k,当满足这个限制条件的时候,递归便不再继续。
每次递归调用之后越来越接近这个限制条件。**之后输出的时候就反过来回去。

这个就是递归的思路。

四、迭代与递归

不知大家有没有认真思考过上面的求斐波那契数的代码,它有什么问题?

在这里插入图片描述
如果我们这里求的是第50个斐波那契数呢?大家可以运行一下代码。可以发现,电脑运行了好久好久才算出结果,费时间。
如果求第10000个斐波那契数呢?程序就会崩溃。

为什么呢?
我们发现上面求斐波那契数的 Fib 函数 在调用的过程中很多计算其实在一直重复。
因为我们在调用这个函数的时候,除前两位外,后一个数的值等于前两位相加。这就导致了我们不断重复计算

如图:
在这里插入图片描述 我们可以看到,由于前两个数相加等于后一个数,前两个数相加等于后一个数,所以我们会不断产生重复的计算。就会造成计算量非常大,效率极低

那我们如何改进呢?
我们程序存东西的时候,存放在栈区。
如图:
在这里插入图片描述

在调试 例子中的Fib函数的时候,如果你的参数比较大,那就会报错: `stack overflow(栈溢出) 这样的信息。
系统分配给程序的栈空间是有限的,但是如果出现了死循环,或者(死递归),这样有可能导致一直开辟栈空间,最终产生栈空间耗尽的情况,这样的现象我们称为栈溢出。

那如何解决上述的问题:

  1. 将递归改写成非递归。
  2. 使用static对象替代non-static局部对象。在递归函数设计中,可以使用static对象替代nonstatic局 部对象(即栈对象),这不仅可以减少每次递归调用和返回时产生和释放nonstatic对象的开销,
    而且static对象还可以保存递归调用的中间状态,并且可为各个调用层所访问。

这里我们介绍迭代

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值