标准阶乘函数应该如何表现?

时间:2011-11-26 05:09:58

标签: math factorial

当我用Google搜索“如何找到数字的阶乘”时,我得到了很多答案......

其中一个例子是......

private double getFactorial(double f){
    if ( f == 0 ) 
        return 1;
    return (f * getFactorial(f - 1));
}

它有效...但是,Windows计算器让我感到惊讶:它也适用于十进制数字!!

例如:在Windows计算器上,0.5的阶乘为0.886226925 ...

这是理想的行为吗?是非整数定义的阶乘吗?

4 个答案:

答案 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是一个正整数。

阶乘函数应该按照您的设计精确运行。不多也不少。