遞歸原理

這是我參與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

相關文章
相關標籤/搜索