遞歸
遞歸是一種解決問題的方法,通常我們可以理解成函數調用自身;
什么遞歸?遞歸怎么寫?
首先直接調用自身的方法和函數,他是一個遞歸,我們看代碼:
復制代碼
var recursiveFun = function(params){recursiveFun(params);
}
// or
var recursiveFun1 = function(params){recursiveFun2(params);
}
var recursiveFun2 = function(params){recursiveFun1(params);
}
復制代碼
假設現在我們要執行recursiveFun() or recursiveFun1(); 從上面函數,我們能知道他會一直重復調用;因此,每個遞歸函數都需要有邊界條件,我們通俗一點,可以叫它停止點,作用是為了防止無限遞歸。
如果防止遞歸停止,無限遞歸帶來的問題
我們先思考一個問題,如果忘記加上停止遞歸函數的邊界條件,會發生什么呢? 會一直執行函數嗎?
答案是不會,遞歸并不會無限的執行下去,瀏覽器會拋出錯誤,也就是所謂的棧溢出錯誤;我們可以通過以下代碼來測試:
var i = 0;
var recursiveFun = function(){i++;recursiveFun();
}
try {recursiveFun();
} catch (err) {console.log(`i=${i}error:${err}`)
}
復制代碼
var i = 0;
var recursiveFun = function(){if (i > 100) return;i++;recursiveFun();
}
try {recursiveFun();
} catch (err) {console.log(`i=${i}error:${err}`)
}
復制代碼
總結
我們得到一個結論,具有停止遞歸的邊界條件很重要;