递归原理

这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战java

什么是递归

方法自身调用身就是递归。算法

可是,递归算法有个缺点, 就是很耗费栈内存,能够不用的时候尽可能别用。 此外, 递归必须有结束条件,不然会发生栈内存溢出错误;即便有告终束条件,也可能发生栈内存溢出错误,由于递归太深了。markdown

原理

下面以Java语言为例来讲明递归的原理知识函数

1.JVM的内存空间

在JVM内存划分上有三块主要的内存空间:post

  • 方法区内存:在类加载的时候,class字节码代码片断被加载到该内存空间;
  • 堆内存:new的对象在堆内存中存储;
  • 栈内存:方法代码片断执行的时候,会给该方法分配内存空间,在栈内存中压栈。存储的是局部变量。

当类加载的时候,方法(函数)代码片断存储在方法区中 在这里插入图片描述 代码片断虽然在方法区内存当中只有一份,可是能够被重复调用;每一次调用这个方法的时候,须要在栈内存中给该方法分配内存空间。spa

方法在调用的瞬间,会给该方法分配内存空间,会在栈中发生压栈动做;方法执行结束之后,给该方法分配的内存空间所有释放,此时发生弹栈动做。code

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为止。 方法执行完后再逐个出栈。 在这里插入图片描述orm

相关文章
相关标签/搜索