递归
非法使用
public class testRecursion{
public static void main(String[] args){
doSome();
}
public static void doSome(){
System.out.println("doSome begin");
doSome();
System.out.println("doSome over");
}
}
以上程序,doSome
虽然只有一份,但是可以被重复的调用,并且只要调用doSome
方法就会在栈内存中新分配一块所属的内存空间,没有任何弹出,一直在不断的压栈。
练习
不使用递归,计算1~N的和【可以不用递归,尽量不用递归】
public class testRecursion{
public static void main(String[] args){
int a = sum(4);
System.out.println(a);
}
public static int sum(int size){
int result = 0;
int i = 0;
while(i <= size){
result += i;
i++;
}
return result;
}
}
使用递归,计算1~N的和
public class testRecursion{
public static void main(String[] args){
int a = sum(4);
System.out.println(a);
}
public static int sum(int size){
if (size == 1)
return 1;
return size + sum(size - 1);
}
}
不使用递归,计算N的阶乘
public class testRecursion{
public static void main(String[] args){
int a = sum(5);
System.out.println(a);
}
public static int sum(int size){
int i = 1;
int result = size;
while(i < size){
result = result * (size - i);
i++;
}
return result;
}
}
使用递归,计算N的阶乘
public class testRecursion{
public static void main(String[] args){
int a = sum(5);
System.out.println(a);
}
public static int sum(int size){
if(size == 1)
return 1;
return size * sum(size - 1);
}
}
理论
- 什么是递归?
- 方法自身调用自身
test(){test();}
- 传递和回归
- 方法自身调用自身
- 递归是很耗费栈内存的,递归算法可以不用的时候尽量别用。
- 无法结束的递归会发生这样一个错误**「这不是异常,这是一个 Error」**:
java.lang.StackOverflowError
栈内存溢出错误
错误一旦发生就无法挽回,只会有一个结果:JVM
停止工作。 - 递归必须要有结束条件,没有结束条件一定会发生栈内存溢出错误。
- 递归即使有了结束条件,即使结束条件是正确的,也可能会发生栈内存溢出错误,因为递归的太深了
递归可以不使用尽量别用。
但是有些情况下该功能的实现必须依靠递归方式。