当我用Google搜索“如何找到数字的阶乘”时,我得到了很多答案......
其中一个例子是......
private double getFactorial(double f){
if ( f == 0 )
return 1;
return (f * getFactorial(f - 1));
}
它有效...但是,Windows计算器让我感到惊讶:它也适用于十进制数字!!
例如:在Windows计算器上,0.5
的阶乘为0.886226925
...
这是理想的行为吗?是非整数定义的阶乘吗?
答案 0 :(得分:3)
让我的评论回答:
可以通过 Gamma Function 将阶乘推广到几乎所有数字(实数/复数/非整数)。
由于奇点,它仍然未定义的唯一点是负整数。 (通过反转阶乘的递归标识很容易看出。从0!
到(-1)!
导致除以零。)
显然,您的代码仅适用于整数。对于其他任何事情,它将进入无限递归并导致堆栈溢出。
对于整数,使用简单循环或递归计算它很容易。但对于其他任何事情,这都要难得多。
在非积分点评估阶乘/伽玛函数有两种主要算法:
维基百科在Python中有后者的实现。
答案 1 :(得分:0)
如果要查找数字的阶乘,则应使用long / int返回类型和long / int类型参数声明它;因为阶乘只适用于非负整数。 实施例
private long getFactorial(int f) {
if ( f == 0 )
return 1; //0!=1
return (f * getFactorial(f - 1)); //basic recursive formula
}
当您尝试查找(-1.1)时,您的代码会进入无限循环(或至少是堆栈溢出)!或(0.001)! ...
此外,我不确定Windows计算器中发生了什么(例如,1.5!返回1.3293403881791370204736256125059),但我认为这会有所帮助:http://en.wikipedia.org/wiki/Gamma_function
答案 2 :(得分:0)
可以使用Gamma function将因子推广到实数。设G(x)为x的x和p(x)x的广义阶乘(也称为Pi function)。 G(x)和P(x)之间的关系是P(x)= x * G(x)。
你可以find G(0.5)是sqrt(pi)= sqrt(3.141592 ......)。因此P(0.5)= 0.5 * sqrt(3.141592 ...)= 0.5 * 1.772453 ... = 0.886226 ...
请注意,着名的pi数恰好是G(x)值的一部分,而另一个函数被称为Pi函数这一事实之间没有直接联系。
答案 3 :(得分:0)
准确地说,阶乘函数是在所有非负整数上精确定义的函数。
伽玛函数不是阶乘函数。它是复数的函数。 gamma(n)计算(n-1)!对于n是一个正整数。
阶乘函数应该按照您的设计精确运行。不多也不少。