【发布时间】:2011-07-05 10:04:48
【问题描述】:
如何在 Python 中计算整数的阶乘?
【问题讨论】:
标签: python
如何在 Python 中计算整数的阶乘?
【问题讨论】:
标签: python
最简单的方法是使用math.factorial(Python 2.6 及以上版本可用):
import math
math.factorial(1000)
如果您想/必须自己编写,可以使用迭代方法:
def factorial(n):
fact = 1
for num in range(2, n + 1):
fact *= num
return fact
或recursive 方法:
def factorial(n):
if n < 2:
return 1
else:
return n * factorial(n-1)
请注意,factorial function 仅针对正整数定义,因此您还应该检查 n >= 0 和 isinstance(n, int)。如果不是,请分别提出ValueError 或TypeError。 math.factorial 会为您解决这个问题。
【讨论】:
factorial 函数中使用 factorial。如何在当前定义的函数中使用相同的函数?我是 Python 新手,所以我只是想了解一下。
RecursionError(尝试 factorial(999)),除非您 increase Python's recursion limit
在 Python 2.6 及更高版本上,尝试:
import math
math.factorial(n)
【讨论】:
float 传递给此函数将引发DeprecationWarning。如果您想这样做,您需要将n 显式转换为int:math.factorial(int(n)),这将丢弃小数点后的任何内容,因此您可能需要检查n.is_integer()
def fact(n):
f = 1
for i in range(1, n + 1):
f *= i
return f
【讨论】:
如果您使用的是 Python 2.5 或更早版本,请尝试
from operator import mul
def factorial(n):
return reduce(mul, range(1, n+1))
对于较新版本的 Python,math 模块中有阶乘,如此处其他答案中给出的那样。
【讨论】:
reduce 已从 Python 3 中删除。
from functools import reduce
最短且可能最快的解决方案是:
from math import factorial
print factorial(1000)
您还可以构建自己的解决方案。通常你有两种方法。最适合我的是:
from itertools import imap
def factorial(x):
return reduce(long.__mul__, imap(long, xrange(1, x + 1)))
print factorial(1000)
(它也适用于更大的数字,当结果变为long)
第二种实现方式是:
def factorial(x):
result = 1
for i in xrange(2, x + 1):
result *= i
return result
print factorial(1000)
def factorial(n):
if n < 2:
return 1
return n * factorial(n - 1)
【讨论】:
factorial(999)(及以上)将引发RuntimeError,除非你increase Python's recursion limit
def fact(n, total=1):
while True:
if n == 1:
return total
n, total = n - 1, total * n
cProfile.run('fact(126000)')
4 function calls in 5.164 seconds
使用堆栈很方便(就像递归调用一样),但它是有代价的:存储详细信息会占用大量内存。
如果栈高,说明计算机存储了大量函数调用的信息。
该方法只占用常量内存(如迭代)。
def fact(n):
result = 1
for i in range(2, n + 1):
result *= i
return result
cProfile.run('fact(126000)')
4 function calls in 4.708 seconds
def fact(n):
return math.factorial(n)
cProfile.run('fact(126000)')
5 function calls in 0.272 seconds
【讨论】:
另一种方法是使用np.prod,如下所示:
def factorial(n):
if n == 0:
return 1
else:
return np.prod(np.arange(1,n+1))
【讨论】:
非递归解决方案,无导入:
def factorial(x):
return eval(' * '.join(map(str, range(1, x + 1))))
【讨论】:
如果你喜欢的话,你也可以递归地把它写成一行。这只是个人选择的问题。这里我们使用 Python 中的内联 if else,类似于 Java 中的 ternary operator:
Expression1 ? Expression2 : Expression3
function call 方法:def factorial(n): return 1 if n == 0 else n * factorial(n-1)
lambda函数做法:(虽然不建议将 lambda 函数直接分配给一个名称,因为这被认为是一种不好的做法,并且可能会给您的代码带来不一致。知道这一点总是好的。请参阅 PEP8 .)
factorial = lambda n: 1 if n == 0 else n * factorial(n-1)
【讨论】: