1.什么是递归
在学习c语言的时候,总能看到函数递归这个词,那么递归到底是什么呢?其实递归就是函数自己调用自己,或者说递归是一种解决问题的方法。下面是一个简单的递归演示:
这里仅仅演示了递归,main函数反复的调用自己,最终会导致栈溢出。
2.递归的思想
当我们遇到一个大型复杂的问题,我们可以尝试用递归将这个问题层层转化成与原来的问题相似,但是规模较小的子问题来解决。一直到子问题不能再化成更小的子问题,递归也就结束了。总结来说:递归思考方式就是将大事化小。其中递推种的递代表就是递推的意思,归就是回归的意思。后面我会用例子来慢慢体会。
3.递归的限制条件
一般用递归的时候存在2个重要条件:1:递归是存在限制条件的,当满足这个限制条件的时候递归不再继续。2:每次递归都越来越接近这个限制条件。下面在例子中慢慢体会。
4.递归举例
4.1 求n的阶乘
题目:计算n的阶乘(不考虑溢出),n的阶乘就是1~n的数字累积相乘。
思考:我们知道,一个数的阶乘是所有小于及等于该数的正整数的积。比如求5的阶乘,5的阶乘就是5*4*3*2*1。假设求阶乘是一个非常大新复杂耗时间的问题,并且随着被阶乘数的增大,耗费时间会越来越多。那么能不能把求5的阶乘转化成5*4!,这里也是求4的阶乘,和求5的阶乘一样都是求阶乘,并且求4的阶乘的规模要比求5的阶乘的规模小。这样依次类推,简化后的问题又可以简化成5*4*3!---> 5*4*3*2!---> 5*4*3*2*1!。知道化成求0的阶乘的时候递归便结束了。
通过分析可以得到递归公式:
4.2 画图推演
红色部分是递推,绿色部分是回归。在这个例子中,每次递归都越来越接近0这个限制条件,当达到这个限制条件时就开始返回,不能无限进行下去。