遞歸是一種解決問題的方法,一般咱們能夠理解成函數調用自身;javascript
首先直接調用自身的方法和函數,他是一個遞歸,咱們看代碼:
複製代碼
var recursiveFun = function(params){
recursiveFun(params);
}
// or
var recursiveFun1 = function(params){
recursiveFun2(params);
}
var recursiveFun2 = function(params){
recursiveFun1(params);
}
複製代碼
假設如今咱們要執行recursiveFun() or recursiveFun1(); 從上面函數,咱們能知道他會一直重複調用;所以,每一個遞歸函數都須要有邊界條件,咱們通俗一點,能夠叫它中止點,做用是爲了防止無限遞歸。java
咱們先思考一個問題,若是忘記加上中止遞歸函數的邊界條件,會發生什麼呢? 會一直執行函數嗎?瀏覽器
答案是不會,遞歸併不會無限的執行下去,瀏覽器會拋出錯誤,也就是所謂的棧溢出錯誤;咱們能夠經過如下代碼來測試:函數
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}`)
}
複製代碼
咱們獲得一個結論,具備中止遞歸的邊界條件很重要;測試