使用装饰器通过表格查找数字的阶乘
def factorial(n):
if n<1:
return 1
else:
f=[0]*(n+1) #creation of the array/list#
f[0]=1 #initialization#
for i in range(1,n+1):#the loop#
f[i]=i*f[i-1] #the recursion + adding in the list#
return f[n]
现在我如何使用装饰器来完成这项工作? 以下是我的尝试 ''' #tabulation(从下到上)与装饰器
import time
def tabulation(func):
def inner(*args,**kwargs):
n=str(args)+str(kwargs)
n=int(n[1])
m=[0]*(n+1)
if n not in m:
m[n]=func(*args,**kwargs)
print(m)
return(m[n])
return inner
@tabulation
def fact(n):
if n<=1:
return n
else:
return n*fact(n-1)
start=time.time()
f=fact(5)
end=time.time()
start=time.time()
g=fact(10)
end=time.time()
print(f," ",end-start)
print(g," ",end-start)
print(m)
'''
制表装饰器应在内部函数之外定义表,以便可以在调用之间共享该表,并且由于该表现在是在内部函数之外定义的,因此无法使用任何项目对其进行初始化,因为
n
尚不清楚直到内部函数被调用。相反,根据需要使用 list.extend
方法动态增长表:
def tabulation(func):
def inner(n):
if n < len(table):
return table[n]
for i in range(len(table), n + 1):
table.extend([func(i)])
return table[n]
table = []
return inner
@tabulation
def fact(n):
if n <= 1:
return 1
return n * fact(n - 1)
演示:在线试用!