[英]Understanding a factorial function in 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):
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#。 這是我唯一沒有完全理解的功能。
這是主要的算法
iProduct = 1
for iFactor in xrange(1, i+1):
iProduct *= iFactor
其他代碼用於緩存結果。
即使不了解Python,也必須清楚這兩個函數遠非相同。 C#版本通過遞歸計算階乘,而Python則通過迭代計算它(雖然以一種奇怪的方式,一些奇怪的記憶/緩存繼續進行 - 我想如果你想在生命周期中計算多個階乘一個程序)。
無論如何,由於計算階乘是一種非常簡單的算法,因此在兩種情況下都能得到相同的算法。
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
}
它將返回相同的結果,但Python版本可能會有更好的性能,因為它會記住結果
它只是將一個名為lstFactorial
的屬性lstFactorial
到factorial
。 此屬性是用於緩存先前調用結果的1000個值的列表。
def factorial(i):
if not hasattr(factorial, 'lstFactorial'): #program checks whether caching list exists
factorial.lstFactorial = [None] * 1000 #if so, it creates a list of thousand None elements (it is more or less equivalent to C/C++'s NULL
if factorial.lstFactorial[i] is None: #prog checks if that factorial has been already calculated
iProduct = 1 #set result to 1
for iFactor in xrange(1, i+1): # C's for(iFactor = 1; iFactor <= i+1; iFactor++)
iProduct *= iFactor #we multiply result times current loop counter
factorial.lstFactorial[i] = iProduct #and put result in caching list
return factorial.lstFactorial[i] #after all, we return the result, calculated jest now or obtained from cache
說實話,它不是最好的算法,因為它只部分使用緩存。
簡單,用戶友好的階乘函數(無緩存)將是:
def factorial(i):
if i == 0 or i == 1:
return 1
return i*factorial(i-1)
對於懶惰的python程序員,最類似於C#示例:
f = lambda i: i and i*f(i-1) or 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.