鍍金池/ 問(wèn)答/C++  HTML/ 關(guān)于尾遞歸,我哪里寫(xiě)錯(cuò)了,為什么輸入大時(shí)還是會(huì)報(bào)棧溢出?

關(guān)于尾遞歸,我哪里寫(xiě)錯(cuò)了,為什么輸入大時(shí)還是會(huì)報(bào)棧溢出?

如題,我用遞歸計(jì)算PI的近似值:PI/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 + ···;
代碼如下:

let calPI = (n, sum = 1)=> {
    if(n < 3) 
        return sum*4;    
    n%4 === 1 ? sum += 1/n : sum -= 1/n;
    return calPI(n-2, sum);
}
console.log(calPI(99999));

calPI(9999)沒(méi)有報(bào)棧溢出,請(qǐng)問(wèn)我是哪里寫(xiě)錯(cuò)了嗎?

回答
編輯回答
冷眸

V8曾經(jīng)有尾遞歸優(yōu)化,但現(xiàn)在已經(jīng)刪掉了
因?yàn)槲策f歸優(yōu)化會(huì)破壞函數(shù)的調(diào)用棧信息

2018年9月1日 01:29
編輯回答
司令

到目前(2018年7月3日)為止,javascript 引擎除 Safari 瀏覽器外,其他主流瀏覽器,如谷歌(包括 v8、node.js)、火狐均未實(shí)現(xiàn) TCO(Tail call optimization)。

你可以使用其他實(shí)現(xiàn)了 TCO 的語(yǔ)言來(lái)測(cè)試算法,例如 C 語(yǔ)言。

參考資料

  1. Tail call optimization in ECMAScript 6, http://2ality.com/2015/06/tai...
  2. es6, https://kangax.github.io/comp...
2018年7月14日 13:16