一篇帮你搞定C语言“套娃”(递归)

前言

前面呢,我们介绍了C语言的函数内容,这次给大家介绍一下C语言的”套娃“(递归)。递归可以把我们日常的大事小事化,那么由我来带大家了解和深入递归。

什么是递归?

程序调用自身的编程技巧称为递归( recursion)。
递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接 调用自身的
一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解, 递归策略
只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
递归的主要思考方式在于:把大事化小

注意前方高能
给大家写一个史上最简单递归代码。

int main()
{
	printf("hehe\n");
	main();
	return 0;
}

运行结果>
在这里插入图片描述
可以看出代码进入了死循环。
我们先来分析一下这个代码>第一次执行打印"hehe"然后接着调用main函数,再打印"hehe",再调用,再打印,就像无限递归一样,就好比镜子里面有个镜子镜子里面有个镜子一直循环下去,但是程序到最后会崩掉(栈溢出了),我们打断点调试一下>
在这里插入图片描述
可以看到他会报出Stack overflow(栈溢出)的异常
在这里插入图片描述
由上面内存图我们可以看出在执行mian函数的时候会一直调用main函数,而调用的同时会在栈区上开辟内存空间,照这样递归下去迟早会出现栈溢出,最终程序崩溃,所以说上面的代码是一个错误代码,会发生错误的递归。
那么为了避免以上的情况发生,我们必须要对递归做出限制条件。

递归的两个必要条件

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

我们通过几道典型的题目来深入理解一下套娃思路>

练习1

接受一个整型值(无符号),按照顺序打印它的每一位。 例如: 输入:1234,输出 1 2 3 4

.我们来试着分析一下>
如何得到每一位数字呢,我们画图看一下
在这里插入图片描述
我们用1234%10可以得到他的个位4,再对1234/10可以去掉个位得到123,再对123%10可以得到个位3,然后再对123/10去掉个位得到12,这样依次下去可以得到1234的每一位数字。
我们再来画图看一下
在这里插入图片描述
我们可以把代码拆分成上面这样,当n是一位数的时候不在才分,然后我们看看代码实现>

void print(int n)
{
	if (n > 9)
	{
		print(n / 10);
	}
	printf("%d ", n % 10);
}
int main()
{
	int num = 1234;
	print(num);
	return 0;
}

我们让代码运行试试>
在这里插入图片描述
ok没问题是我们要的结果,那代码该怎么理解呢,首先我们要知道递归 的递—“递推”、归—“回归”(递归递归先递再归!)
我们来把代码单独拿出来分析一下>
在这里插入图片描述
红色的线是,蓝色的线是,看完这个图相信大家已经能够很好的理解递归的过程了。
再来回过头看看这句话:

只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

这就是递归的特点。
那么我们来强调两个重点>
在这里插入图片描述
n>9是保证递归能够停下来,n/10是保证递归能够正常按照我们的需求进行下去!
在这里插入图片描述

练习2

求一个数的阶乘(递归实现不考虑溢出)

参考代码:

int factorial(int n)
{
	if (n <= 1)
		return 1;
	else
		return n * factorial(n - 1);
}

int main()
{
	int n = 5;
	int print_factorial = factorial(5);
	printf("%d", print_factorial);
	return 0;
}

我们再画图分析一下代码>
在这里插入图片描述
还是一样红色的线是,蓝色的线是!!!
看了这个图,大家对递归就有了更深一层次的理解!
提示:

  1. 许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更为清晰。
  2. 但是这些问题的迭代实现往往比递归实现效率更高,虽然代码的可读性稍微差些。
  3. 当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开
    销。

总结

以上就是我为大家介绍的C语言“套娃”的基本思想,相信大家看了以上内容一定会对递归有更深层次的理解。
种一棵树的最好时间是十年前,其次是现在! 把握好当下,合理利用时间努力奋斗,相信大家一定会实现自己的目标!加油!
创作不易,辛苦各位小伙伴们动动小手,三连一波~~~,本文中也有不足之处,欢迎各位随时私信点评指正!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.小智

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值