Python 计算阶乘的函数

如何在 Python 中计算整数的阶乘?

540839 次浏览

最简单的方法是使用 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 >= 0isinstance(n, int)。如果不是,分别提高 ValueErrorTypeErrormath.factorial会帮你搞定的。

在 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时,它也适用于较大的数字)

实现同样目标的第二种方法是:

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

使用堆栈很方便(就像递归调用一样) ,但是它也有代价: 存储详细信息会占用大量内存。

如果堆栈很高,这意味着计算机存储了大量关于函数调用的信息。

该方法只占用常量内存(如迭代)。

或者使用“ for”循环

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 中的 三元运算符三元运算符:

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)