作为一个刚入坑的小白,在老师讲递归从开始到结束都是出于一脸懵逼的状态,在我看来递归就是函数不停的调用自身,至于它执行的过程是怎么样就不知道了,在后来的编程中对递归思想有了进一步的理解。
首先从写三个方法开始吧。
public static void method1(){
System.out.println("我是方法一");
}
public static void method2(){
System.out.println("我是方法二");
}
public static void method3(){
System.out.println("我是方法三");
}
这是三个比较简单的方法值,这三个函数基本做的是同一件事,那我们在主函数调用它们时需要每一个都要写出来。
public static void main(String[] args) {
method1();
method2();
method3();
}
他们的输出结果是:
我是方法一
我是方法二
我是方法三
Process finished with exit code 0
现在做一个小小的改动。
public static void method1(){
method2();
System.out.println("我是方法一");
}
public static void method2(){
method3();
System.out.println("我是方法二");
}
public static void method3(){
System.out.println("我是方法三");
}
在method1和method2输出之前,分别调用method2和method3,现在在主方法中调用method1
public static void main(String[] args) {
method1();
method1执行,在输出之前调用了method2,所以只能等method2执行完毕才能输出,但是method2在输出之前又调用了method3.所以method2只能在method3执行结束之后才能输出。那么最后的输出顺序是method3-》method2-》method1
我是方法三
我是方法二
我是方法一
Process finished with exit code 0
当然如果代码改成先输出再调用也可以,只不过输出顺序会与上面的结果相反,我们发现其实这三个方法做的事情是一样的,只不过方法名不一样,那就可以把它们改成同名的方法,当然实际情况是不允许我们这样做的,现在用递归思想来写一个函数来达到上面一样的效果。
public static void digui(int x){
digui(x-1);
System.out.println("我是方法"+x);
}
看一下这个递归方法。当然这个是错误的方法,这个方法在输出之前,要不停的调用自己,什么时候能结束?貌似他没有一个停下来的条件,就是会陷入一个死循环。所以我们应该给他设置一个出口。
public static void digui(int x){
if(x>3){
return;
}
digui(x+1);
System.out.println("我是方法"+x);
}
public static void main(String[] args) {
digui(1);
}
执行结果:
我是方法3
我是方法2
我是方法1
Process finished with exit code 0
现在用递归方法做一件实际性的事,简单一点的,求12的阶乘。
public static int factorial(int f){
int result;
if(f>0){
result=f*factorial(f-1);
}else {
return 1;
}
return result;
}
public static void main(String[] args) {
int result=factorial(12);
System.out.println(result);
}
结果:
479001600
Process finished with exit code 0
在使用递归的时候需要注意的事:
1.为防止递归陷入死循环,在递归函数中要及时的返回,也就是设置一个出口,在所有的递归函数中都要有一个终止递归的条件判断。
2.递归可以简化程序,但一般不能提高程序的执行效率。递归对内存的占用是巨大的,在使用递归函数时尽量少用局部变量。