javascript遞歸算法計(jì)算一個(gè)數(shù)的階乘

計(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ì)算階乘。

第一次寫(xiě)東西,markdown用的還不太熟練。希望以后能再好一點(diǎn)。本篇文章若有紕漏之處,歡迎指出。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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