1.什么是递归?
递归(Recursion):(递区---归来) 方法直接或间接调用自身
2.递归的两个条件
递归的基本思想是把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。另外这个解决问题的函数必须有明显的结束条件。
(1)子问题与原问题为同一类型
(2)有一个终止条件
3.递归例子
斐波那契数列,阶乘,树(定义和相关操作)
4.递归与迭代
计算阶乘:
递归实现:
1 int factorial (int n) { 2 if (n == 1) { 3 return 1; 4 } else { 5 return n*factorial(n-1); 6 } 7 }
迭代实现:
1 int factorial (int n) { 2 int product = 1; 3 for(int i=2; i<n; i++) { 4 product *= i; 5 } 6 return product; 7 }
迭代有这样几个条件:1、有一个有初始值的变量。2、一个说明变量值如何更新的规则。3、一个结束条件。(循环三要素:循环变量、循环体和循环终止条件)。
首先分析递归,其实递归最大的有点就是把一个复杂的算法分解成若干相同的可重复的步骤。所以,使用递归实现一个计算逻辑往往只需要很短的代码就能解决,并且这样的代码也比较容易理解。但是,递归就意味着大量的函数调用。函数调用的局部状态是用栈来记录的。所以,这样就可能浪费大量的空间,如果递归太深的话还有可能导致堆栈溢出。
接下来分析迭代。其实,递归都可以用迭代来代替。但是相对于递归的简单易懂,迭代就比较生硬难懂了。尤其是遇到一个比较复杂的场景的时候。但是,代码的难以理解带来的有点也比较明显。迭代的效率比递归要高,并且在空间消耗上也比较小。