遞迴與棧
阿新 • • 發佈:2020-11-20
棧是一種資料結構,進棧的資料遵循一個規則:先進後出。
所有的函式呼叫都會進棧。
遞迴指的是呼叫自己的函式。最經典的例子就是階乘計算。
每個遞迴函式都有兩個條件:基線條件和遞迴條件。
我們在呼叫遞迴時,每一次 的遞迴呼叫都會進入棧,最上層的函式呼叫只能訪問自己的變數,不能訪問其它呼叫變數。每一次的呼叫都會佔據一定的記憶體來儲存變數,如果遞迴沒有終止的話,就會把記憶體佔滿,從而宕機。因此,我們希望遞迴有一個終止,這個終止稱為基線條件。
遞迴的本質就是分而治之,把一個規模較大的問題分解成若干個問題較小的問題,然後逐個解決。
基線條件就是分解出來的最小粒度的問題,問題分解到這一步就不再細分,也可以看作是終止條件。
遞迴條件是滿足繼續縮小問題規模的條件,使其符合基線條件。
編寫涉及陣列的遞迴函式時,基線條件通常是陣列為空或者只包含一個元素。。
public class demo { public static void main(String[] args) { int[] arr= {0,1,2,3,4}; System.out.println(digui(arr,arr.length-1)); } //求一個數組的所有元素之和,這個問題其實可以看成求元素的前n項之和,這樣函式的適用範圍更廣 //基線條件就是陣列的元素為0個 //遞迴條件為陣列及其剩餘的元素個數 //遞迴時最好不要新建變數 private static int digui(int[] arr,int n){ if(n==0){ return 0; }else{ return arr[n]+digui(arr,n-1); } } }