我该如何在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
或者采用递归的方法:
def factorial(n):
if n < 2:
return 1
else:
return n * factorial(n-1)
请注意,阶乘函数仅定义为正整数,因此您还应检查n >= 0
并且isinstance(n, int)
。如果不是,则分别引发一个ValueError
或TypeError
异常。math.factorial
将为您处理这些异常。
在 Python 2.6 或更高版本中,可以尝试以下方法:
import math
math.factorial(n)
float
传递给此函数将引发DeprecationWarning
。如果您想这样做,您需要显式地将n
转换为int
:math.factorial(int(n))
,这将丢弃小数点后的任何内容,因此您可能需要检查n.is_integer()
。 - user3064538最短且可能是最快的解决方案如下:
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)
from operator import mul
def factorial(n):
return reduce(mul, range(1, n+1))
对于较新版本的Python,math模块中有阶乘函数,如其他答案所示。
from functools import reduce
。 - John La Rooydef 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
def fact(n):
f = 1
for i in range(1, n + 1):
f *= i
return f
另一种方法是使用下面的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中的三元运算符:
Expression1 ? Expression2 : Expression3
函数调用
方法: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)
factorial
函数内部使用factorial
。你怎么能在当前定义的函数内部使用相同的函数?我是Python新手,所以我只是想理解一下。 - J82factorial(999)
,那么递归函数将会因为超出998的数字而引发RecursionError
,除非你增加Python的递归限制。请注意,递归函数会反复调用自身,直到达到基本情况来停止。 - user3064538