理解Python中的阶乘函数

3 投票
6 回答
654 浏览
提问于 2025-04-15 15:28

我正在尝试理解下面这个Python函数:

def factorial(i):
    if not hasattr(factorial, 'lstFactorial'):
        factorial.lstFactorial = [None] * 1000
    if factorial.lstFactorial[i] is None:
        iProduct = 1
        for iFactor in xrange(1, i+1):
            iProduct *= iFactor
        factorial.lstFactorial[i] = iProduct
    return factorial.lstFactorial[i]

它是否会和C#中的等效函数产生相同的结果:

long factorial(long n) 
{ 
   return n <= 1 ? 1 : n * factorial(n-1);
}

当输入值为12或更小的时候。

我对Python一无所知,只是刚把一些Python代码转换成了C#。这是我唯一不太理解的函数。

6 个回答

2

我不是Python专家,但我觉得这个函数是在创建一个包含1000个条目的静态数组,然后根据需要来填充这些条目,以避免重复计算。在C++中,这个过程可能是这样的:

long factorial(int i){
    //Cache array
    static long factorials[1000];
    if (!factorials[i]){ //If not cached, calculate & store
        int product = 1;
        for (int idx = 1; idx <= i + 1; ++idx){
            product *= idx;
        }
        factorials[i] = product;
    }
    return factorials[i]; //Return cached value
}
2

即使你对Python不太了解,应该也能看出来这两个函数差别很大。C#的版本是通过递归来计算阶乘,而Python的版本则是通过迭代来实现的(不过方式有点奇怪,还涉及到一些记忆化/缓存的操作——我想这是为了让你在程序运行期间可以计算多个阶乘)。

总之,因为计算阶乘这个算法非常简单,所以无论用哪种方式,结果都是一样的。

4

这是主要的算法

iProduct = 1
for iFactor in xrange(1, i+1):
    iProduct *= iFactor

其他的代码是用来缓存结果的。

撰写回答