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