如何在 Python 中计算整数的阶乘?
最简单的方法是使用 math.factorial(可在 Python 2.6及以上版本中使用) :
math.factorial
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会帮你搞定的。
n >= 0
isinstance(n, int)
ValueError
TypeError
在 Python 2.6及以上版本中,请尝试:
import math math.factorial(n)
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,数学模块中有 factorial,这里的其他答案中也给出了这一点。
最短也可能是最快的解决方案是:
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时,它也适用于较大的数字)
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)
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
4 function calls in 4.708 seconds
def fact(n): return math.factorial(n)
5 function calls in 0.272 seconds
另一种方法是使用如下所示的 np.prod:
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 中的 三元运算符三元运算符:
if else
Expression1 ? Expression2 : Expression3
function call
def factorial(n): return 1 if n == 0 else n * factorial(n-1)
lambda
(虽然不建议将 lambda 函数直接分配给名称,因为这被认为是一种不好的做法,可能会给代码带来不一致性。知道总是好的。见 图片来源: http://www.python.org/dev/peps/pep-0008/rel = “ nofollow noReferrer”> PEP8 )
factorial = lambda n: 1 if n == 0 else n * factorial(n-1)