淺談javascript遞歸(白話版)

遞歸

遞歸是一種解決問題的方法,一般咱們能夠理解成函數調用自身;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}`) 
}
複製代碼

以上是運行結果,從圖中咱們能看出在執行15661次後瀏覽器給咱們拋出了錯誤:RangeError: Maximum call stack size exceeded; 超過最大調用棧大小; 咱們如何中止遞歸呢;咱們只須要加一個條件便可;假設咱們條件是當i累加到100的時候中止。代碼以下:

var i = 0;
var recursiveFun = function(){
    if (i > 100) return;
    i++;
    recursiveFun();
}
try {
    recursiveFun();
} catch (err) {
    console.log(`i=${i}error:${err}`) 
}
複製代碼

總結

咱們獲得一個結論,具備中止遞歸的邊界條件很重要;測試

相關文章
相關標籤/搜索