Math 标准阶乘函数应该如何运行?

Math 标准阶乘函数应该如何运行?,math,factorial,Math,Factorial,当我在谷歌上搜索“如何找到一个数字的阶乘”时,我得到了很多答案 其中一个例子是 private double getFactorial(double f){ if ( f == 0 ) return 1; return (f * getFactorial(f - 1)); } 而且它是有效的。。。然而,Windows计算器让我惊讶:它也适用于十进制数 例如:在Windows计算器上,0.5的阶乘是0.886226925 这是你想要的行为吗?阶乘是为非整数定义的

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

其中一个例子是

private double getFactorial(double f){
    if ( f == 0 ) 
        return 1;
    return (f * getFactorial(f - 1));
}
而且它是有效的。。。然而,Windows计算器让我惊讶:它也适用于十进制数

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


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

回答我的评论:

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

唯一未定义的点是由于奇点导致的负整数。(通过反转阶乘的递归标识很容易看出这一点。从
0!
(-1)!
将导致被零除。)

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


对于整数,使用简单的循环或递归很容易计算。但对于其他事情来说,这要困难得多

在非整数点上计算阶乘/伽马函数有两种主要算法:

  • 与通常的递归属性相结合

Wikipedia用Python实现了后者。

回答我的评论:

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

唯一未定义的点是由于奇点导致的负整数。(通过反转阶乘的递归标识很容易看出这一点。从
0!
(-1)!
将导致被零除。)

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


对于整数,使用简单的循环或递归很容易计算。但对于其他事情来说,这要困难得多

在非整数点上计算阶乘/伽马函数有两种主要算法:

  • 与通常的递归属性相结合

Wikipedia在Python中实现了后者。

如果要查找数字的阶乘,则应使用long/int返回类型和long/int类型参数声明;因为阶乘只适用于非负整数。 范例

您的代码进入无限循环(或者至少是堆栈溢出),比如,当您尝试查找(-1.1)!或(0.001)


另外,我不确定windows计算器中发生了什么(比如,1.5!返回1.3293403881791370204736256125059),但我认为这会有所帮助:

如果您想找到一个数字的阶乘,应该使用long/int返回类型和long/int类型参数声明它;因为阶乘只适用于非负整数。 范例

您的代码进入无限循环(或者至少是堆栈溢出),比如,当您尝试查找(-1.1)!或(0.001)


另外,我不确定windows计算器中发生了什么(比如,1.5!返回1.3293403881791370204736256125059),但我认为这会有所帮助:

阶乘可以通过使用。设G(x)是x的gamma,P(x)是x的广义阶乘(也称为a)。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…)


请注意,著名的π数恰好是G(x)值的一部分这一事实与另一个函数称为π函数这一事实之间没有直接联系。

阶乘可以通过使用。设G(x)是x的gamma,P(x)是x的广义阶乘(也称为a)。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…)


请注意,著名的π数恰好是G(x)值的一部分这一事实与另一个函数称为π函数这一事实之间没有直接联系。

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

伽马函数不是阶乘函数。它是一个关于复数的函数。 伽马(n)计算(n-1)!对于n是一个正整数


阶乘函数的行为应该与您设计的完全相同。不多也不少。

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

伽马函数不是阶乘函数。它是一个关于复数的函数。 伽马(n)计算(n-1)!对于n是一个正整数


阶乘函数的行为应该与您设计的完全相同。不多不少。

事实上,不,这对非整数不起作用。广义到所有数字(包括非整数)的阶乘与Gamma函数(几乎)相同-这不是那么容易计算。()@Jigar Joshi请查看编辑….您不应该精确比较双打。此外,对于非整数,这永远不会返回(实际上:很可能引发堆栈溢出异常)。有一些方法可以将阶乘扩展到有理数甚至复数,例如Gamma函数和Pi函数。我也不同意向下投票和关闭投票。在这种情况下,如果阶乘是为非整数定义的,这是一个非常有效的问题。事实上,不,这不适用于非整数。广义到所有数字(包括非整数)的阶乘与Gamma函数(几乎)相同-这不是那么容易计算。()@Jigar Joshi请查看编辑….您不应该精确比较双打。此外,对于非整数,这永远不会返回(实际上:很可能抛出堆栈溢出EXE)
private long getFactorial(int f) {

   if ( f == 0 ) 
        return 1; //0!=1
   return (f * getFactorial(f - 1)); //basic recursive formula

}