C# 理解python中的阶乘函数

C# 理解python中的阶乘函数,c#,python,C#,Python,我试图理解以下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): iProduc

我试图理解以下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#中的等效结果相同的结果:

长阶乘(长n)
{ 
返回n这里是主要算法

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

其他代码用于缓存结果。

它将返回相同的结果,但Python版本可能会有更好的性能,因为它会记忆结果

即使不了解Python,您也必须清楚这两个函数远非完全相同。C版本是通过递归计算阶乘,而python one是通过迭代来实现的(虽然有点奇怪,有一些奇怪的记忆/缓存在进行——我想如果你想在程序的生命周期中计算多个阶乘的话)

无论如何,由于计算阶乘是一个非常简单的算法,在两种情况下都是相同的。

IANAPG(Python Guru),但是我觉得函数是创建一个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
}
长阶乘(int i){
//缓存阵列
静态长阶乘[1000];
如果(!factorials[i]){//如果未缓存,则计算并存储
int乘积=1;

对于(int idx=1;idx它只是将一个名为
lstfactrial
的属性附加到
factorial
。此属性是用于缓存以前调用的结果的1000个值的列表。

def factorial(i):
如果不是hasattr(factorial,'lstfactrial'):#程序检查缓存列表是否存在
factorial.lstfactrial=[None]*1000#如果是这样,它将创建一个包含数千个None元素的列表(它或多或少相当于C/C++的NULL)
如果factorial.lstfactrial[i]为None:#prog检查该factorial是否已计算
IPProduct=1#将结果设置为1
对于xrange(1,i+1)中的iFactor:#C表示(iFactor=1;iFactor=i+1;iFactor++)
iProduct*=iFactor#我们将结果乘以当前循环计数器
factorial.lstfactrial[i]=ipproduct#并将结果放入缓存列表
return factorial.lstfactrial[i]#毕竟,我们返回结果,即现在计算的jest或从缓存中获得的结果
老实说,它不是最好的算法,因为它只部分使用缓存

简单、用户友好的阶乘函数(无缓存)是:

def阶乘(i):
如果i==0或i==1:
返回1
返回i*阶乘(i-1)
对于懒惰的python程序员来说,最类似于C#示例:

f=lambda i:i和i*f(i-1)或1

为什么不试着检查一下?为什么不安装python?这是一个小型MSI,只需不到5分钟。是什么阻止了这一点?我明白你为什么会感到困惑。这是一个非常糟糕的python。它考虑得非常糟糕。递归方法的问题(你可能很清楚,但提到这一点是为了操作的好处),表示将使用足够高的数字超过最大递归深度(Python中默认为1000)即使你使用了一个通过累加器并进行尾部调用的版本,你也会达到这个极限,因为Python没有尾部调用优化。是的,我知道。我应该在答案中写出来,只是忘记了。对不起,谢谢你的评论。:)小心+1。Python
xrange(a,b)
创建包括a和b-1在内的所有值。其思想是
xrange
返回
b-a
不同的值。
xrange(1,5)
返回4个值:1、2、3、4。足够公平-这就是为什么我把免责声明放在前面。我做了一些python黑客攻击,但不太多。而且,
long
的长度不足以将值保存到阶乘(999)。阶乘(13)将溢出一个有符号的32位整数。什么,你希望我免费提供它吗?:-)+1用于解释它使用记忆化(这是正确的),这是加速计算的解决方案之一,如果结果在过去已经计算过的话。+1用于解释它使用记忆化。但是两种解决方案不同-C#的解决方案使用递归,而Python的不使用递归。
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
}