1. 程式人生 > 實用技巧 >遞迴與棧

遞迴與棧

棧是一種資料結構,進棧的資料遵循一個規則:先進後出。

所有的函式呼叫都會進棧。

遞迴指的是呼叫自己的函式。最經典的例子就是階乘計算。

每個遞迴函式都有兩個條件:基線條件和遞迴條件。

我們在呼叫遞迴時,每一次 的遞迴呼叫都會進入棧,最上層的函式呼叫只能訪問自己的變數,不能訪問其它呼叫變數。每一次的呼叫都會佔據一定的記憶體來儲存變數,如果遞迴沒有終止的話,就會把記憶體佔滿,從而宕機。因此,我們希望遞迴有一個終止,這個終止稱為基線條件。

遞迴的本質就是分而治之,把一個規模較大的問題分解成若干個問題較小的問題,然後逐個解決。

基線條件就是分解出來的最小粒度的問題,問題分解到這一步就不再細分,也可以看作是終止條件。

遞迴條件是滿足繼續縮小問題規模的條件,使其符合基線條件。

編寫涉及陣列的遞迴函式時,基線條件通常是陣列為空或者只包含一個元素。。

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);
        }
    }
}