作者:吴耀存
日期:2019-5-7
文献类型:专题
递归:递归就是自己调用自己的过程,必须含有终止条件,否则将会陷入无限循环。
下面我实现了一个阶乘(4)的功能,给大家讲解一下递归的运行过程
public class HolleWorle {
public static void main(String agrs[]) {
//实例化类
HolleWorle holle=new HolleWorle();
System.out.println(holle.factorial(4));
}
public int factorial(int x){
//终止条件
if(x==1){
return 1;
}
//递归
int y=x*factorial(--x);
return y;
}
}
下面是我画的一个图,这个图是递归在内存中的运行过程讲解以及注意点
(为了方便讲解递归过程我先给每一次运行的factorial方法赋一个名字,分别是factorial1、factorial2、factorial3、factorial4)
1.从下图可以看到factorial这个方法执行了四次
2.每次执行factorial方法是传的x变量要减1,否则无法满足终止条件会陷入死循环。
3.运行过程:facaorial1调用factorial2方法,此时facaorial1并没有结束,正在等待factorial2方法的返回值,而factorial2又在等待factorial3方法的返回值,当执行到factorial4方法时,返回了一个1给factorial3方法,factorial3方法对返回的1进行运算,运算完成后factorial3方法返回了一个y值给factorial2方法,factorial2 又对返回的y值运算,运算完成返回y值给facaorial1,facaorial1再把运算完成的结果返回给调用者。

递归结果:

递归的误点:不要以为在递归的时候,在内存中不会相同的方法,要是这要理解的话那么在return的时候会被搞蒙,因为你会以为return了就返回值并跳出了该方法,所以你会对正确的答案无法理解是怎么得出来的。
递归的优点:代码简洁、清晰
递归的缺点引用: 引用的链接
1.递归由于是函数调用自身,而函数调用是有时间和空间的消耗的:每一次函数调用,都需要在内存栈中分配空间以保存参数、返回地址以及临时变量,而往栈中压入数据和弹出数据都需要时间。->效率
2.递归中很多计算都是重复的,由于其本质是把一个问题分解成两个或者多个小问题,多个小问题存在相互重叠的部分,则存在重复计算,如fibonacci斐波那契数列的递归实现。->效率
3.调用栈可能会溢出,其实每一次函数调用会在内存栈中分配空间,而每个进程的栈的容量是有限的,当调用的层次太多时,就会超出栈的容量,从而导致栈溢出。->性能
日期:2019-5-7
文献类型:专题
递归:递归就是自己调用自己的过程,必须含有终止条件,否则将会陷入无限循环。
下面我实现了一个阶乘(4)的功能,给大家讲解一下递归的运行过程
public class HolleWorle {
public static void main(String agrs[]) {
//实例化类
HolleWorle holle=new HolleWorle();
System.out.println(holle.factorial(4));
}
public int factorial(int x){
//终止条件
if(x==1){
return 1;
}
//递归
int y=x*factorial(--x);
return y;
}
}
下面是我画的一个图,这个图是递归在内存中的运行过程讲解以及注意点
(为了方便讲解递归过程我先给每一次运行的factorial方法赋一个名字,分别是factorial1、factorial2、factorial3、factorial4)
1.从下图可以看到factorial这个方法执行了四次
2.每次执行factorial方法是传的x变量要减1,否则无法满足终止条件会陷入死循环。
3.运行过程:facaorial1调用factorial2方法,此时facaorial1并没有结束,正在等待factorial2方法的返回值,而factorial2又在等待factorial3方法的返回值,当执行到factorial4方法时,返回了一个1给factorial3方法,factorial3方法对返回的1进行运算,运算完成后factorial3方法返回了一个y值给factorial2方法,factorial2 又对返回的y值运算,运算完成返回y值给facaorial1,facaorial1再把运算完成的结果返回给调用者。

递归结果:

递归的误点:不要以为在递归的时候,在内存中不会相同的方法,要是这要理解的话那么在return的时候会被搞蒙,因为你会以为return了就返回值并跳出了该方法,所以你会对正确的答案无法理解是怎么得出来的。
递归的优点:代码简洁、清晰
递归的缺点引用: 引用的链接
1.递归由于是函数调用自身,而函数调用是有时间和空间的消耗的:每一次函数调用,都需要在内存栈中分配空间以保存参数、返回地址以及临时变量,而往栈中压入数据和弹出数据都需要时间。->效率
2.递归中很多计算都是重复的,由于其本质是把一个问题分解成两个或者多个小问题,多个小问题存在相互重叠的部分,则存在重复计算,如fibonacci斐波那契数列的递归实现。->效率
3.调用栈可能会溢出,其实每一次函数调用会在内存栈中分配空间,而每个进程的栈的容量是有限的,当调用的层次太多时,就会超出栈的容量,从而导致栈溢出。->性能