0.目录
一.什么是递归
二.递归的限制条件
三.递归的举例
四.递归与迭代
1.什么是递归
递归其实是一种解决问题的方法,在c语言中:递归就是函数自己调用自己。
写一个最简单的递归代码:
include<stdio.h>
int main()
{
printf("hehe\n");
main();//调用
return 0;
}
上述代码,在main函数中调用main函数,这就是递归。不过这个例子不太恰当,它会无限循环,运行代码会造成死循环,造成栈溢出
栈溢出:每一次函数调用,都要为这一次函数调用分配内存空间,是内存中的栈区上分配的,如果无限的递归调用函数,就会将栈区内存空间填满(用完),这时就会出现栈溢出的现象。如下图:
1.1递归的思想
递归的思考方式就是把大事化小的过程。
递归中的递就是递推 的意思,归就是回归的意思。
1.2递归的限制条件
1.递归存在限制条件,当满足这个限制条件,便不再继续。(上述main函数就是反例)
2.每次递归调用之后越来越接近这个限制条件。
2.递归举例
2.1
举例1:求n的阶乘
看不懂的看下图:
递归是少量的代码完成了大量的运算!
2.2
举例2:顺序打印一个整数的每一位
比如:
输入:1234
打印:1 2 3 4
参考代码:
逻辑导图:
3.递归与迭代
在c语言中每一次函数调用,都需要在本次函数调用在内存的栈区申请一块内存空间来保存函数调用期间各种局部变量的值,这块空间被称为运行时堆栈或者函数栈帧
函数不返回,函数对应的栈帧空间就会一直占用,所以如果函数调用中存在递归调用的话,每一次递归函数调用都会开辟属于自己的栈帧空间,直到函数递归不再继续,开始回归,才逐层释放栈帧空间。
所以如果采用函数递归的方式完成代码,递归层次太深,就会浪费太多的栈帧空间,也可能引起栈溢出的问题。
所以如果不想使用递归,就得想其他办法,通常就是迭代的方式(循环可以实现迭代,但是迭代不仅仅是循环)
3.1
举例3:求第n个斐波那契数。
解释斐波那契数列:前两个数为1,后面数为前两个数之和。
1 1 2 3 5 8 13 21 34 55…
所以如果求第n个斐波那契数,那就是n的前两个数的和。
逻辑导图:
参考代码:
这个问题用递归解决其实并不合适,因为其中会有很多重复计算,反而用循环的方式会很简便。
参考代码如下;
递归虽好,但也不要迷恋递归,适可而止就好。