使用es6的蹦床函數解決遞歸造成的堆棧溢出


 

首先,我們先定義一個函數,使用遞歸的思想寫求和的方法:

function sum(x, y) {
    if (y > 0) {
        return sum(x + 1, y - 1);
    } else {
        return x;
    }
}

  當我們執行的時候

sum(1, 100000000000)

  這個時候會出現一個堆棧溢出的錯誤,在es6里面,有一個為遞歸優化的方法可以解決,即在最后一步調用函數,且實現函數的柯里化(多參函數轉換成單參數函數),但是需要開啟嚴哥模式,普通模式下會報錯,這個時候我再阮大神的es6書籍里面,看到了蹦床函數,結合.bind,使函數調用的時候是自己的方法,但是確是另一個函數對象,不是本身,這個時候就不會造成內存的泄露,發生堆棧溢出了,實現代碼如下:

function trampoline(f) {
  while (f && f instanceof Function) {
    f = f();
  }
  return f;
}

  

function sum(x, y) {
  if (y > 0) {
    return sum.bind(null, x + 1, y - 1);
  } else {
    return x;
  }
}

  

trampoline(sum(1, 100000))

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM