递归方法就是自己调用自己的方法,自己调用自己会导致反复调用,需要设置一个结束条件才能停下来。递归方法和循环非常相似,其反复执行的都是大括号内的代码,循环的结束条件既可以由if和break组成,也可以由小括号内的布尔表达式组成,而递归的结束条件只能由if和return组成。相对的,递归过程中传递数据既可以通过递归方法外的变量或对象完成也可以通过小括号内的参数完成,而循环过程中传递数据只能通过循环外的变量或对象完成。循环能解决的问题也一定能用递归解决,但递归能解决一些循环不能解决的问题。递归的效率比较低,无论是耗费的计算时间还是占用的存储空间都比循环要多得多,所以实际开发中能用循环就用循环。递归结构清晰,可读性强,容易用数学归纳法来证明算法的正确性,在学习开发中用递归更容易理解算法的设计原理,学会了再优化成循环结构。递归和循环也可以互相嵌套,结合使用,以达到最优效果。
【例1】问题描述:计算阶乘。
公式:0!=1,n!=(n-1)!×n。
1 /**这个方法用递归求一个正整数的阶乘
2 * 时间复杂度为O(n)
3 * 空间复杂度为O(n)
4 * @param n 正整数
5 * @return 正整数的阶乘
6 */
7 int factorial1(int n){
8 return (n == 0) ? 1 : n*factorial1(n-1);
9 }
10 /**这个方法用循环求一个正整数的阶乘
11 * 时间复杂度为O(n)
12 * 空间复杂度为O(1)
13 * @param n 正整数
14 * @return 正整数的阶乘
15 */
16 int factorial2(int n){
17 int f = 1;
18 for (int i = n; i >0 ; i--) {
19 f *= i;
20 }
21 return f;
22 }
【例2】问题描述:计算斐波那契数列。
公式:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)
扫描二维码关注公众号,回复:
11271907 查看本文章
【例3】问题描述:计算阿克曼函数。