題目:
計算一個整數(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/