在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

關(guān)于尾遞歸,我哪里寫錯(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)沒有報(bào)棧溢出,請(qǐng)問我是哪里寫錯(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 的語言來測(cè)試算法,例如 C 語言。

參考資料

  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