# 《程序员数学:阶乘》—— 阶乘的用途是什么?
作者:小傅哥
博客:https://bugstack.cn (opens new window)
源码:https://github.com/fuzhengwei/java-algorithms (opens new window)
沉淀、分享、成长,让自己和他人都能有所收获!😄
# 一、前言
阶乘的历史
早在12世纪,印度学者就已有使用阶乘的概念来计算排列数的纪录。1677年时,法比安·斯特德曼使用Change ringing来解释阶乘的概念。在描述递归方法之后,斯特德将阶乘描述为:“现在这些方法的本质是这样的:一个数字的变化数包含了所有比他小的数字(包括本身)的所有变化数……因为一个数字的完全变化数是将较小数字的变化数视为一个整体,并透过将所有数字的完整变化联合起来。”
# 二、定义
阶乘可通过连续乘积来定义:n!=1·2·3···(n-2)·(n-1)·n
用连乘积符号可表示为:
从上述公式中,可以推导出递推关系:n!=n·(n-1)!
但递归定义须给出base case,因此需要定义零的阶乘。 除此之外,递推关系在阶乘函数中各个值皆成立,例如:
- 5!=5·4!
- 6!=6·5!
- 50!=50·49!
# 三、实现
递归实现
public class Factorial {
public long factorial(long number) {
if (number <= 1)
return 1;
else {
return number * factorial(number - 1);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
- 就是一个简单的递归调用,实现起来还是蛮简单的。
# 四、测试
单元测试
@Test
public void test() {
Factorial factorial = new Factorial();
long result = factorial.factorial(5);
System.out.println("测试结果:" + result);
}
1
2
3
4
5
6
2
3
4
5
6
- 计算5的阶乘,测试结果120