計(jì)算一個(gè)整數(shù)的階乘
如果用字母n來(lái)代表一個(gè)整數(shù),階乘代表著所有小于或等于n的整數(shù)的乘積。
階乘通常簡(jiǎn)寫(xiě)成 n!
例如:
5! = 1 * 2 * 3 * 4 * 5 = 120
代碼如下,使用遞歸思想,
function factorialize(num) { return (num * factorialize(num - 1)); }
在函數(shù)內(nèi)部繼續(xù)調(diào)用。但是這樣會(huì)無(wú)限遞歸下去,比如
5 * 4 * 3 * 2 * 1 * 0 * -1 * -2 ...
所以加上限定條件
function factorialize(num) { if (num>0) { return (num * factorialize(num - 1)); }
但是這樣會(huì)輸出
null
原來(lái)是
factorialize(5)*factorialize(4)*factorialize(3)*factorialize(2)*factorialize(1)
而factorialize(1)并沒(méi)有值。
所以再加上
function factorialize(num) { if (num>0) {return (num * factorialize(num - 1));} else return (1); }
當(dāng)num=1的時(shí)候,factorialize(1)=1,所以可以正確計(jì)算出結(jié)果。
結(jié)果為
factorialize(5)*factorialize(4)*factorialize(3)*factorialize(2)*factorialize(1)
并且factorialize(1)=1
總結(jié)一下代碼
function factorialize(num) {
if (num>0)
{return (num * factorialize(num - 1));}
else
return (1);
}
factorialize(5);
12月4日更新
使用函數(shù)arguments.callee屬性解耦
arguments有一個(gè)名叫callee屬性,該屬性是一個(gè)指針,指向擁有arguments對(duì)象的函數(shù)。
原函數(shù)的執(zhí)行與函數(shù)factorialize緊緊耦合到了一起,這不優(yōu)雅,所以可以使用arguments.callee屬性解耦
function factorialize(num) {
if (num>0) {
return (num * arguments.callee(num - 1));
} else {return (1);}
}
這樣無(wú)論引用函數(shù)使用什么名字,都可以正常遞歸,例如
var trueFactorialize = factorialize;
factorialize = function () {
return 0;
};
console.log(trueFactorialize(5)); //120
console.log(factorialize(5)); //0
即使factorialize變了,trueFactorialize也可以正常計(jì)算階乘。