鍍金池/ 問(wèn)答/Python  HTML/ JS階乘尾遞歸結(jié)果異常.

JS階乘尾遞歸結(jié)果異常.

// 尾遞歸方式
function factorial1(n,total) {
    if (n === 1) {
        return total;
    }
    return factorial1(n - 1, n * total);
}

// 普通遞歸方式
function factorial2(n) {
    if (n === 1) {
        return 1;
    }
    return n * factorial2(n - 1);
}

console.log(factorial1(25,1)); // 1.5511210043330984e+25 
console.log(factorial2(25)); // 1.5511210043330986e+25

當(dāng)n的值比較大的時(shí)候比如25, 結(jié)果就開(kāi)始異常, 使用非尾遞歸的方式計(jì)算出的結(jié)果才是正確的.
這是哪里出了問(wèn)題?

回答
編輯回答
呆萌傻

計(jì)算中的數(shù)值過(guò)大,導(dǎo)致了數(shù)值類型溢出,普通遞歸的方式重復(fù)進(jìn)行大數(shù)計(jì)算,存在溢出導(dǎo)致精度損失的步驟多了就和 方法1 有了差異,計(jì)算有誤差的是 方法2

參考:
https://stackoverflow.com/que...

2017年10月7日 14:36