遞歸函數原理 技能包瞭解一下

最近在看一本書:算法圖解,而後恰好看到了遞歸,自覺得很簡單的嘛,而後就啪啪啪的打臉了。爲啥緣由被打臉呢?請看下面簡單的遞歸求數組和的函數:
算法

function sum (arr, value){
    if(arr.length){
        value +=  arr.pop();
        sum(arr,value);
    }
    return value;
}
sum([1,2,3],0);

複製代碼

若是執行以上代碼,你會發現:最終結果返回了3。當時非常納悶?爲何會產生這個結果呢,
數組

帶着這個疑問 我就好好又溫習了一遍遞歸章節
首先你必須知道 遞歸的兩大條件:基線條件和遞歸條件
  一、基線條件:指的是中止調用本身的條件
  二、遞歸條件:指的是調用自身的條件
bash

知道了兩大條件後咱們還須要瞭解到 遞歸函數的原理:既計算機是如何調用遞歸式的函數:
  一、計算機中有一個調用棧的內存空間,這個空間 專門用於存放計算機將要調用的函數列表。
  二、調用棧的兩種使用方式,壓入棧和彈出棧,這兩個方法,好似存放和再拿出來使用。
  三、遞歸函數,其實剛開始執行時,是先把已知的待執行函數都存放到調用棧中,而後依次執行,因爲棧是先進後出的,因此遞歸函數的執行順序是和咱們想象中的有所不一樣的。
函數

好了,瞭解完遞歸的原理後,咱們再拿開篇的函數sum 執行你會發現,剛開始執行時:sum([1,2],3)被放到待執行棧中。而後依次是sum([1],5)、sum([],6) 由於棧的特性:因此執行順序恰好是相反的,sum([],6) => sum([1],5) => sum([1,2],3) 因此咱們最終獲得的 3

具體執行順序請看完整的流程圖:
ui

)

其實正確的寫法很簡單,並不須要傳遞多餘的參數:
spa

function sum(arr){
    if(arr.length){
        return arr.pop()  +  sum(arr)
    }
    return 0
}
sum([1,2,3]);
複製代碼

你get 到遞歸函數的技能了嗎?code

相關文章
相關標籤/搜索