這是我參與8月更文挑戰的第6天,活動詳情查看:8月更文挑戰java
方法自身調用身就是遞歸。算法
可是,遞歸算法有個缺點, 就是很耗費棧內存,能夠不用的時候儘可能別用。 此外, 遞歸必須有結束條件,不然會發生棧內存溢出錯誤;即便有告終束條件,也可能發生棧內存溢出錯誤,由於遞歸太深了。markdown
下面以Java語言爲例來講明遞歸的原理知識函數
在JVM內存劃分上有三塊主要的內存空間:post
當類加載的時候,方法(函數)代碼片斷存儲在方法區中 代碼片斷雖然在方法區內存當中只有一份,可是能夠被重複調用;每一次調用這個方法的時候,須要在棧內存中給該方法分配內存空間。spa
方法在調用的瞬間,會給該方法分配內存空間,會在棧中發生壓棧動做;方法執行結束之後,給該方法分配的內存空間所有釋放,此時發生彈棧動做。code
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