递归使用场景
转载自https://blog.csdn.net/ggxxkkll/article/details/7524056
递归的特点,可以看出递归可以大大缩短程序的代码,有意识的使用递归,可以用较短的代码解决一些复杂的问题。甚至有些问题非得使用递归解决不可。那么什么时候我们该使用递归呢?
递归简介
递归算法的 基本思想 是:把规模大的、较难解决的问题变成规模较小的、易解决的同一问题。规模较小的问题又变成规模更小的问题,并且小到一定程度可以直接得出它的解,从而得到原来问题的解。
(递归来源于数学中的归纳法)
递归的三个条件
1. 解决问题时,可以把一个问题转化为一个新的问题,而这个新的问题的解决方法仍与原问题的解法相同,只是所处理的对象有所不同,这些被处理的对象之间是有规律的递增或递减;
2. 可以通过转化过程是问题得到解决;
3. 必定要有一个明确的结束递归的条件,否则递归将会无止境地进行下去,直到耗尽系统资源。也就是说必须要某个终止递归的条件。如求阶乘问题,我们要求n的阶乘(n!),可以把这个问题转化为n(n-1)!,而要求(n-1)!又可转化为(n-1)(n-2)!,……,这里面都有一个一个数乘以另一个数阶乘的问题,被处理的对象分别是n,n-1,……,是有规律的递减。但是我们不能让程序无休止的乘下去,必须要给他一个结束条件,该问题恰好有一个结束条件,那就是当n=0时,0!=1。
递归VS循环
递归与循环是两种不同的解决问题的典型思路。
比较 | 优点 | 缺点 |
---|---|---|
递归算法 | 代码简洁、清晰,并且容易验证正确性。 | 它的运行需要较多次数的函数调用,如果调用层数比较深,每次都要创建新的变量,需要增加额外的堆栈处理,会对执行效率有一定影响,占用过多的内存资源。 |
循环算法 | 速度快,结构简单。 | 并不能解决所有的问题。有的问题适合使用递归而不是循环。如果使用循环并不困难的话,最好使用循环。 |