使用装饰器进行制表(动态规划)

问题描述 投票:0回答:1

使用装饰器通过表格查找数字的阶乘

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)

'''

python-3.x dynamic-programming python-decorators factorial
1个回答
0
投票

制表装饰器应在内部函数之外定义表,以便可以在调用之间共享该表,并且由于该表现在是在内部函数之外定义的,因此无法使用任何项目对其进行初始化,因为

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)

演示:在线试用!

© www.soinside.com 2019 - 2024. All rights reserved.