阶乘函数(Python)中返回的负数

2024-05-23 13:53:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的代码来计算n!在

import numpy as np

print "n! (for n<31)"
print

n = input("Enter n: ")

lst = []
for i in range(1,n+1):
    lst.append(i)

print lst     #Just to see if the program is working

print "n!: ", np.prod(lst)

但是,对于某些数字,程序返回负值。在

例如。 以下是我运行n=20时在控制台上显示的:

^{pr2}$

n=32时也会发生这种情况 但是,这个程序对其他数字也有效,比如3!返回6。在

有人能解释一下吗。在


Tags: 代码inimport程序numpyforinputas
3条回答

以下是numpy prod函数文档的链接:

numpy.prod

如果您转到该页的底部,您将看到最后一个示例,即当x(函数的给定参数)是无符号整数时,返回的结果是一个默认平台整数。因此,当结果超过可以存储在32位整数中的值时,numpy不会像python通常那样将结果转换为long类型。所以你得到了整数溢出。在

如果声明函数:

def fact(n): return 1 if n == 1 else (n * fact(n-1))

然后做:

^{pr2}$

你会得到:

2432902008176640000L

这是20!的正确值!。在

顺便说一句,做:

lst = []
for i in range(1,n+1):
    lst.append(i)

不太理想。Python的range函数可以很容易地做到这一点!尝试:

lst = range(1, n + 1)

你已经在你的for循环中这样做了!您可以在解释器中进行测试:

>>> range(1, 20 + 1)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

正如我在评论中所写的,这是一个32位的问题。如果你有一个64位系统,你仍然可以计算多达20!在

下面是一个没有numpy的解决方案,使用python内置类型,可以非常安全地处理此类问题:

def factorial(n):
    result = 1
    for i in range(1, n+1):
        result *= i
    return result

n = input("n! (for n<31)\n\nEnter n: ")
print("n!: %d" % factorial(n))

这里有一个递归函数,可以让你的思维弯曲;-)

^{pr2}$

我强烈怀疑Numpy正在创建一个32位int的数组。在

因此,当n!大于32位整数的限制。在

尝试:

 print "n!: ", np.prod(lst, dtype=np.uint64)

相关问题 更多 >