在c语言中,递归就是函数自己调用自己。
这里写一个史上最简单的c语言递归代码。
在这里呢,就是main函数自己调用了自己,但是这个代码会进入死循环,也称死递归,导致栈溢出(Stack overflow);这里仅供演示。
递归的思想:
递归就是把一个大的问题层层转换为一个与原问题相识,但是规模较小的问题来求解,直到这个小问题不能再拆分,递归就结束了,所以递归的思考方式是把大事化小的过程;
递归中的递就是递推的意思,归是回归的意思。
递归的限制条件:
当然,我们在使用递归的时候,也要给他加上限制条件,不然他就死递归了。
递归有两个限制条件;
1:递归存在限制条件,当满足这个限制条件时,递归将不再继续。
2:每次函数调用的之后会越来越接近这个条件。
递归举例:
一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘是1。
自然数n的阶乘写成n!
比如说我们想求n的阶乘(不考虑溢出),n的阶乘就是1~n之间数字累积相乘;
比如说5的阶乘就是5x4x3x2x1。
其中n的阶乘公式为n! =n*(n-1)!
当n == 0的时候,n的阶乘就是1;
所以n的阶乘递归公式如下
这样我们就可以写出函数Fact来求n的阶乘,假设Fact(n)就是求n的阶乘,那么Fact(n-1)就是求n-1的阶乘;
函数如下
测试:
但我们输入5的时候,结果是120;
5x4x3x2x1=120。
画图推演:
迭代:
递归是一种很好的编程技巧,我们只要得到推导公式,就很容易写成递归的形式。
Fact函数是可以产生正确的结果,但是在递归函数调用的过程中涉及一些运行时的开销。
![](https://img-blog.csdnimg.cn/direct/7c36de828ae941fdbb765ecec8df2871.png)
![](https://img-blog.csdnimg.cn/direct/ddcdc1919a75430eb324ad39b3d453f6.png)
![](https://img-blog.csdnimg.cn/direct/3260388533bb404fabc87d58624e915f.png)
但是如果我们要求第50个的话,我们需要很长时间才能得到结果,为什么呢,因为在递归的过程中很多数字都是重复计算了的,递归层次越深,重复计算越多。
画图理解:
测试理解:
![](https://img-blog.csdnimg.cn/direct/e1b5e61018a14f3da9603a91ef31752b.png)
![](https://img-blog.csdnimg.cn/direct/f8f42919742d4af1a86fe9ef083c8a6b.png)