JavaScript阶乘 (Factoral) 函数实现

什么是阶乘(Factoral)

一个正整数的阶乘是所有小于及等于该数的正整数的积,并且有0的阶乘为1。自然数n的阶乘写作n!

阶乘函数是递归(Recursion)典型示例,在JavaScript中可能运用到递归(Recursion)函数

什么是递归(Recursion)

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。(来自wikipedia)

在函数的定义中使用函数自身的方法。简单理解就是:自我复制的过程。

如何实现阶乘(Factoral)函数

数学上的阶乘(Factoral)函数定义,阶乘函数的参数是一个自然数,它返回1与此数之间所有数的乘积。比如,6的阶乘是1 x 2 x 3 x 4 x 5 x 6 = 720,这样的方式可以用一种递归函数来表示,如果n6,模式为:

1
2
3
4
5
6
7
8
9
0! = 1 // 1
1! = 1 // 1
2! = 2 * 1 // 2
3! = 3 * 2 * 1 // 6
4! = 4 * 3 * 2 * 1 // 24
5! = 5 * 4 * 3 * 2 * 1 // 120
6! = 6 * 5 * 4 * 3 * 2 * 1 // 720
7! = 7 * 6 * 5 * 4 * 3 * 2 * 1 // 5040
...

因此,阶乘可以简单的定义为:

  • 0的阶乘是1
  • 任何数的阶乘都是此数与比此数小一的数的阶乘

定义一个factoral()函数来表示:

1
2
factoral(0) = 1;
factoral(n) = n * factoral (n - 1);

第一行0的阶乘为1,第二行表示任意别的数n的阶乘等于n乘以n-1的阶乘。
注意那个把n-1括起来的括弧:没有这个括弧代码就会被解析称为(factorial n) - 1;函数行为的优先级是很高的,会最先执行。

阶乘(Factorial)实现算法

阶乘函数在JavaScript中也是一种典型的算法:

  • factoral()函数返回的是一个整数的阶乘
  • 如何整数用字母n表示,所有正整数的阶乘是小于或等于n
  • 阶乘通常用的表示符号是n!

阶乘(Factoral)测试用例

  • factoral(0)返回1
  • factoral(1)返回1
  • factoral(5)返回120
  • factoral(10)返回3628800
  • factoral(20)返回2432902008176640000

几种实现阶乘(Factoral)的方法

递归(Recursion)法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* @param: {n}
*
*/
function factoral (n) {
if (n < 0) {
// 如果n是一个小于0的整数,返回false
return false;
} else if (n === 0 || n === 1) {
// 如果n是一个0或者1,返回阶乘结果为1
return 1;
} else {
// 调用递归
return n * factoral (n - 1);
}
}

factoral (0); // 1
factoral (1); // 1
factoral (5); // 120
factoral (6); // 720
factoral (10); // 3628800
factoral (20); // 2432902008176640000

使用函数arguments.callee属性解耦

1
2
3
4
5
6
7
8
9
10
function factoral (n) {
return !(n > 1) ? 1 : arguments.callee(n - 1) * n;
}

factoral (0); // 1
factoral (1); // 1
factoral (5); // 120
factoral (6); // 720
factoral (10); // 3628800
factoral (20); // 2432902008176640000

while loop(while 循环)法

1
2
3
function factoral (num) {
var
}

for loop(for 循环)法

ES6数组迭代法

1
2
3
4
5
6
7
8
function factoral (num) {
return num < 0 ? 1 : ( // 如果num小于0则返回1,否则执行后面的语句
new Array(num) // 实例了一个length为num长度的数组对象
.fill(undefined) // 初始化填充数组的每一项为undefined
.reduce((product, val, index) => product * (index + 1), 1) // reduce对num的每一项进行累加迭代计算,最终返回计算出的结果
);
}
factoral(5); // 调用函数,最终结果为120

参考链接