1.什么是递归?
简单来说就是讲一个复杂的问题拆分成一个与原问题相似但规模较小的子问题,重复这个过程,直到子问题不能拆分为止,递归就结束了。总的来说就是一个大事化小,小事化了的思想。
递归的递就是递推的,归是归一。
2.递归的原理
递归是依靠函数自身调用自身不断拆分问题直到问题解决后,逐步返回的过程。打个比方,递归类似于俄罗斯套娃,而递归就像把娃娃逐个打开然后在逐个关上的过程。
举个示例
题目:求n!
我们可以先举一个较小的数如5!
5!=5 * 4!=5 * 4 *3!=… =5 * 4 * 3 * 2 * 1
那么同理n! =n * (n-1)!= —> =n *(n-1)… 2 * 1
再结合0!= 1
绘图可得:
写成函数形式为:
个人觉得递归的运行还是会让初学者感到有点难度的(别问为什么,问就是我刚学的时候听不懂),所以本人以3举例图解:
敲黑板
3.递归的限制条件
递归在书写的时候,有两个必要条件(不满足必错!!!):
1.递归存在限制条件,当满足这个限制条件的时候,递归便不在继续。
2.每次递归调用之后越来越接近这个限制条件。
理解:对于条件一,我们可以通过上一张图片了解,假设把return 0这一条件删去时函数就会无止境的循环下去,最终会导致一个错误Stack overflow(栈溢出)。(简单来说每一次函数的运行都需要开辟一个空间来存储,而这个空间就是函数栈帧,好比是内存,一旦满了就无法继续下去,这就是栈溢出。)
而对于条件2较好理解就不再解释了。
4.优点和语境(个人理解)
(1)优点:函数递归可以通过少量代码完成大量的相似且重复的计算,可以提升程序员写代码的效率。
(2)语境:使用时首先要分析问题,例如之前举例的求n!的问题,如果n过大,那么也会导致运算效率低下,甚至出错。函数递归就像是画树状图,每一次函数调用都会产生沿着不同的路径直到走到终点,然后再回归原本。所以函数递归用时首先要确保调用次数不能太多,其次要懂得对问题进行深刻剖析再下定论。
5.个人感悟
通过这章的学习我学会了分析问题,明白了为什么学编程要数学好的原因,准确来说是要求我们分析问题和转化问题的能力。