如果用字母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);
進(jìn)化版
使用函數(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ì)算階乘赠堵。