这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战
什么是递归
方法自身调用身就是递归。
但是,递归算法有个缺点, 就是很耗费栈内存,可以不用的时候尽量别用。
此外, 递归必须有结束条件,否则会发生栈内存溢出错误;即使有了结束条件,也可能发生栈内存溢出错误,这是因为递归太深了导致超出了计算机的计算能力。
原理
下面以Java语言为例来说明递归的原理知识:
1.JVM的内存空间
在JVM内存划分上有三块主要的内存空间:
-
方法区内存:在类加载的时候,class字节码代码片段被加载到该内存空间;
-
堆内存:new的对象在堆内存中存储;
-
栈内存:方法代码片段执行的时候,会给该方法分配内存空间,在栈内存中压栈。存储的是局部变量。
当类加载的时候,方法(函数)代码片段存储在方法区中
代码片段虽然在方法区内存当中只有一份,但是可以被重复调用;每一次调用这个方法的时候,需要在栈内存中给该方法分配内存空间。
方法在调用的瞬间,会给该方法分配内存空间,会在栈中发生压栈动作;方法执行结束以后,给该方法分配的内存空间全部释放,此时发生弹栈动作。
2.例题:求3的阶乘
package practice;
public class pr1 {
public static void main(String[] args) {
int n=3;
int result = sum(n);
System.out.println(result);
}
public static int sum(int n) {
if(n==1) {
return 1;
}
return n*sum(n-1);
}
}
代码执行时,首先运行main函数(程序入口),main函数进入栈内存,并存储变量;之后main调了sum,sum压栈,然后sum不断调用自身,直到n==1为止。 方法执行完后再逐个出栈。