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

时间:2013-08-14 09:29:58

标签: python numpy factorial negative-number

我有以下代码来计算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)

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

EG。 当我为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。

有人可以解释一下。

3 个答案:

答案 0 :(得分:3)

这是numpy的prod功能文档的链接:

numpy.prod

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

如果你声明一个函数:

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的范围功能可以轻松完成!尝试:

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]

答案 1 :(得分:1)

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

因此,当n时你看到整数溢出!大于32位整数的限制。

尝试:

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

答案 2 :(得分:0)

正如我在评论中所写,这是一个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))

这是一个弯曲你的思想的递归函数; - )

def factorial_r(n):
    if n < 2:
        return 1
    return n * factorial_r(n-1)

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