Python: 如何以十进制格式表达阶乘的除法?

1 投票
3 回答
2677 浏览
提问于 2025-04-18 14:04

我正在尝试获取拉盖尔多项式的系数,这个过程涉及到阶乘的除法,这是我的代码:

Coeficientes=[]
def Ln(n):
    for m in xrange(n+1):
        Coeficientes.append(((-1)**m *factorial(n))/(factorial(n-m)*factorial(m)*factorial(m)))
    print "Coeficiente de grado", m, ":", Coeficientes[m]

问题是,当我想得到值为0.5的系数时,却得到了0。

举个例子:

Ln(2)

结果:

Coeficiente de grado 0 : 1
Coeficiente de grado 1 : -2
Coeficiente de grado 2 : 0

但应该是:

Coeficiente de grado 2 : 0.5

如果我写Ln(2.),就会返回一个错误:期望整数参数,但得到了浮点数。

3 个回答

0

你需要把其中一个数字转换成浮点数,这样才能防止所有的数字都被当作整数来处理。比如可以用 (-1)**float(m) 或者 (-1.0)**m

Coeficientes=[]
def Ln(n):
    for m in xrange(n+1):
        Coeficientes.append(((-1)**float(m) *factorial(n))/(factorial(n-m)*factorial(m)*factorial(m)))
        print "Coeficiente de grado", m, ":", Coeficientes[m]

在用整数进行除法运算时,Python会把结果当作整数来处理。例如,7/5 的结果是 1。但是如果你用 7.0/5,结果就是 1.4 了。

使用小数(Decimal)会更准确,可以避免一些四舍五入的错误。想了解更多,可以看看这个链接:https://docs.python.org/2/tutorial/floatingpoint.html

1

你的问题出在 factorial 这个函数上。这个函数只能处理正整数。如果你想计算任何实数(包括非整数和整数),应该使用 math.gamma(n)

下面是一个示例代码:

from math import gamma
print (((-1)**m *gamma(n))/(gamma(n-m)*gamma(m)*gamma(m)))

1

你得到的 Coeficiente de grado 2 : 0 而不是 Coeficiente de grado 2 : 0.5 是因为 factorial 这个函数只接受整数。如果你想用其他方法,可以使用 math.gamma(x)

gamma 是对阶乘函数的一个扩展,可以处理实数。(如果你使用的是 Python 2.7 或 3.2 版本)

可以查看 这里的文档

撰写回答