FreeCodeCamp:計算一個整數(shù)的階乘 (Factorialize a Number)

題目:
計算一個整數(shù)的階乘
如果用字母n來代表一個整數(shù),階乘代表著所有小于或等于n的整數(shù)的乘積。
階乘通常簡寫成n!
例如:5! = 1 * 2 * 3 * 4 * 5 = 120
問題解釋:
這個 function 接收一個整數(shù)為參數(shù),返回階乘的計算結(jié)果
比如接收的是 4,那么就返回 24


基本解法:
做一個循環(huán),把每一步的數(shù)乘起來即可
注意,0的階乘和1的階乘均為1
代碼:

function factorialize(num) {
    var result = 1;
    while (num > 1) {
        result *= num;
        num--;
    }
    return result;
}

解釋:

  • 循環(huán)的條件選擇num>1就好,因為任何數(shù)與1相乘都不變
  • 設置初始值為1,不管傳入0還是1,最后得到的結(jié)果都是1,,不用進入while循環(huán)
  • result *= num就相當于result = result * num
  • 不寫num--就會進入無限循環(huán),此處運用for 循環(huán)也OK

思考:如果使用reduce方法

  • reduce() 方法對數(shù)組中的每個元素執(zhí)行一個由您提供的reducer函數(shù)(升序執(zhí)行),將其結(jié)果匯總為單個返回值。

  • reducer 函數(shù)接收4個參數(shù):
    Accumulator (acc) (累計器)
    Current Value (cur) (當前值)
    Current Index (idx) (當前索引)
    Source Array (src) (源數(shù)組)
    reducer 函數(shù)的返回值分配給累計器,該返回值在數(shù)組的每個迭代中被記住,并最后成為最終的單個結(jié)果值。

此時如果要使用reduce,首先要根據(jù)傳入的num創(chuàng)建一個數(shù)組,顯而易見,范圍是1至num
也可以用Array.from創(chuàng)建,Array.from() 方法從一個類似數(shù)組或可迭代對象創(chuàng)建一個新的,淺拷貝的數(shù)組實例。

代碼:

function factorialize(num) {
    return Array.from(Array(num).keys()).map(e => e + 1).reduce((prev, next) => {
        return prev * next;
    }, 1);
}

解釋:
.keys()方法返回一個包含數(shù)組中每個索引鍵的Array Iterator對象。它和from都是ES6語法
.key()返回的是類數(shù)組,而且為從0開始,我們需要的是從1開始返回的數(shù)組,所以在map中加上1


再思考一下,此題可以用遞歸解法

function factorialize(num) {
    // 初始及彈出條件
    if (num === 0) {
        return 1;
    }
    // 遞歸調(diào)用
    return num * factorialize(num - 1)
}

上述代碼的具體解釋可查看翻轉(zhuǎn)字符串的解釋
代碼中第三行條件若更改為num === 1,那么此時傳入0是無法得到1的
最后,如果輸入數(shù)字很大,那么就會發(fā)生棧溢出(stack overflow)的情況,F(xiàn)reeCodeCamp中并不要求此項,如有需要,自行搜索學習“尾遞歸優(yōu)化”。


參考文章:S1ngS1ng:https://singsing.io/blog/fcc/basic-factorialize-a-number/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容