什么是递归:方法自身调用自身即为递归。
递归很耗费栈内存,能不使用尽量不使用;但有些情况下该功能实现必须依赖递归,例如目录的拷贝。
递归必须有结束条件,没有结束条件一定会发生栈内存溢出错误;递归即使有了结束条件,即使结束条件正确,也可能会发生栈内存溢出错误。
不使用递归,计算1~N的和:
/**
不使用递归计算1~N的和。
*/
public class RecursionTest01{
public static void main(String[] args){
//计算1~4的和
int n = 4;
int retValue = sum(n);
System.out.println("sum = " + retValue);
}
public static int sum(int n){
int result = 0;
for(int i = 1; i <= n; i ++){
result += i;
}
return result;
}
}
使用递归计算1~N的和:
/**
使用递归计算1~N的和。
*/
public class RecursionTest02{
public static void main(String[] args){
//计算1~4的和
int n = 4;
int retValue = sum(n);
System.out.println(retValue);
}
public static int sum(int n){
if(n == 1){
return 1;
}
return n + sum(n-1);
}
}
使用递归计算1~4时的内存分析
例:计算N的阶乘。分别使用递归、不使用递归
/**
计算N的阶乘
*/
public class RecursionTest03{
public static void main(String[] args){
//计算n的阶乘
int n = 5;
int retValue1 = method1(n);
int retValue2 = method1(n);
System.out.println(retValue1);
System.out.println(retValue2);
}
//不使用递归计算
public static int method1(int n){
int result = 1;
for(int i = 1; i <= n; i++){
result *= i;
}
return result;
}
//使用递归计算
public static int method2(int n){
if(n == 1){
return 1;
}
return n * method2(n-1);
}
}
总结: