我有以下代码来计算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 时的控制台:
n! (for n<31)
Enter n: 20
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
n!: -2102132736
当 n = 32 时也会发生这种情况 但是,该程序确实适用于其他号码,例如。 3!返回 6,这是应该的。
有人可以解释一下吗?
最佳答案
这里是 numpy 的 prod 函数的文档链接:
如果您转到该页面的底部,您会看到最后一个示例,说明当 x(函数的给定参数)是无符号整数时,返回的结果是默认平台整数。因此,当结果超出 32 位整数所能存储的范围时,numpy 不会像 python 通常那样将结果转换为 long 类型。所以你会遇到整数溢出。
如果你声明一个函数:
def fact(n): return 1 if n == 1 else (n * fact(n-1))
然后做:
fact(20)
你得到:
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]
关于python - 阶乘函数中返回负数 (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18227957/