0

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

其中一个例子是……

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

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

例如:在 Windows 计算器上,的阶乘0.50.886226925...

这是期望的行为吗?是否为非整数定义了阶乘?

4

4 回答 4

3

让我的评论成为答案:

阶乘可以通过Gamma Function推广到几乎所有数字(实数/复数/非整数)。

由于奇点,它仍然未定义的唯一点是负整数。(通过反转阶乘的递归恒等式很容易看出这一点。从0!(-1)!导致除以零。)

显然,您的代码仅适用于整数。对于其他任何事情,它将进入无限递归并导致堆栈溢出。


对于整数,很容易用一个简单的循环或递归来计算它。但对于其他任何事情,它都很难做到。

有两种主要算法可用于在非积分点评估阶乘/伽马函数:

维基百科在 Python 中有后者的实现。

于 2011-11-26T05:17:57.777 回答
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

于 2011-11-26T05:18:19.420 回答
0

阶乘可以使用Gamma 函数推广到实数。让 G(x) 是 x 的 gamma 和 P(x) x 的广义阶乘(也称为Pi 函数)。G(x)和P(x)之间的关系是P(x)=x*G(x)。

你可以发现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 函数的事实之间没有直接联系。

于 2011-11-26T05:21:35.787 回答
0

准确地说,阶乘函数是精确定义在所有非负整数上的函数。

伽玛函数不是阶乘函数。它是复数上的函数。gamma(n) 计算 (n-1)!对于 na 正整数。

阶乘函数的行为应该与您设计的一样。不多也不少。

于 2011-11-26T07:13:52.880 回答