js实现阶乘问题代码
生活随笔
收集整理的這篇文章主要介紹了
js实现阶乘问题代码
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
階乘介紹:一個正整數(shù)的階乘是所有小于及等于該數(shù)的正整數(shù)的積,并且有0的階乘為1。自然數(shù)n的階乘寫作n!
階乘函數(shù)是遞歸函數(shù)典型示例。
階乘的實現(xiàn)方法(一種遞歸,兩種循環(huán)):
方法1:遞歸
function factorial (num) {
if (num < 0) {
return -1;
} else if (num === 0 || num === 1) {
return 1;
} else {
return (num * factorial(num - 1));
}
};
factorial(6);
定義階乘函數(shù)一般都要用到遞歸算法;如上面的代碼所示,在函數(shù)有名字,而且名字以后也不會變的情況下,這樣定義沒有問題。但問題是這個函數(shù)的執(zhí)行與函數(shù)名 factorial 緊緊耦合在了一起。為了消除這種緊密耦合的現(xiàn)象,可以像下面這樣使用 arguments.callee。(非嚴格模式)
function factorial(num){
if (num <=1) {
return 1;
} else {
return num * arguments.callee(num-1)
}
}
在這個重寫后的factorial()函數(shù)的函數(shù)體內(nèi),沒有再引用函數(shù)名 factorial。這樣,無論引用函數(shù)時使用的是什么名字,都可以保證正常完成遞歸調(diào)用。
var trueFactorial = factorial;
factorial = function(){
return 0;
};
alert(trueFactorial(5)); //120
但在嚴格模式下,不能通過腳本訪問 arguments.callee,訪問這個屬性會導(dǎo)致錯誤。不過,可以使用命名函數(shù)表達式來達成相同的結(jié)果
var factorial = (function f(num){
if (num <= 1){
return 1;
} else {
return num * f(num-1);
}
});
方法2:for循環(huán)
function factorial (num) {
if (num < 0) {
return -1;
} else if (num === 0 || num === 1) {
return 1;
} else {
for (var i = num - 1; i >= 1; i--) {
num *= i;
}
}
return num;
};
factorial(6);
方法3:while循環(huán)
function factorial (num) {
var result = num;
if (num < 0) {
return -1;
} else if (num === 0 || num === 1) {
return 1;
} else {
while (num > 1) {
num--;
result *= num;
}
}
return result;
};
factorial(6);
方法4:尾遞歸
function factorial(n, total) {
if (n === 1) return total;
return factorial(n - 1, n * total);
}
factorial(5, 1) // 120
本文轉(zhuǎn)自:https://www.cnblogs.com/jialuchun/p/6559422.html
總結(jié)
以上是生活随笔為你收集整理的js实现阶乘问题代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 雷军终极反思:运气有多重要
- 下一篇: js正则表达式验证大全