Java递归
- 递归,指在当前方法内调用自己的这种现象.
- 递归演示:
public void method(){
System.out.println("递归的演示")
//在当前方法内调用自己
method();
}
递归结构
-
1:递归尽头:什么时候不调用自己,如果没有头,将陷入死循环
常见的递归头:就是if判断 -
2:递归体
什么时候需要调用自身方法。
注意:就算没有递归头,java中递归不会无限的递归下去,递归太深,堆栈内存会溢出 -
面试题:循环个递归区别?
-
递归算法:
优点:代码简洁、清晰,并且容易验证正确性。(如果你真的理解了算法的话,否则你更晕)
缺点:它的运行需要较多次数的函数调用,如果调用层数比较深,需要增加额外的堆栈处理,比如参数传递需要压栈等操作,会对执行效率有一定影响。但是,对于某些问题,如果不使用递归,那将是极端难看的代码。 -
循环算法:
优点:速度快,结构简单。
缺点:并不能解决所有的问题。有的问题适合使用递归而不是循环。如果使用循环并不困难的话,最好使用循环。 -
递归算法 和循环算法总结
一般递归调用可以处理的算法,也通过循环去解决常需要额外的低效处理 。
现在的编译器在优化后,对于多次调用的函数处理会有非常好的效率优化,效率未必低于循环。
递归分为两种
直接递归
- 递归的代码演示,计算1-n之间的和,使用递归完成
public class DiGuiDemo {
public static void main(String[] args) {
//计算1~num的和,使用递归完成
int n = 5;
int sum = getSum(n);
System.out.println(sum);
}
public static int getSum(int n) {
if(n == 1){
return 1;
}
return n + getSum(n-1);
}
}
- 注意:递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出.在递归中虽然有限定条件,但是递归次数不能太多, 否则也会发生栈内存溢出.
间接递归
- 间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法.
public class Hello {
public static void main(String[] args) {
Hello hello = new Hello();
hello.a();
}
public void a() {
b();
}
public void b() {
c();
}
public void c() {
a();
}
}
- 递归有入口,一定要有出口,不然会导致栈溢出.