2 回答
TA贡献1890条经验 获得超9个赞
你可以用functools.lru_cache
这个
from functools import lru_cache
@lru_cache(maxsize=32)
def T(n,k):
q = 0
if n == 0 and k == 0:
return(1)
q = 1
if k>n or n<0:
return(0)
q = 1
if q != 1:
return(T(n-1,k-1)+n*T(n-1,k))
您可以使用此装饰器来记忆函数调用,特别是使用此函数,这将保存maxsize最近的调用。
请注意,在这种特殊情况下,由于您的陈述,绝大多数print时间实际上都花在了写入控制台上。如果您删除它(但仍然保留您的T(i,n)调用),您的代码将几乎立即完成。
TA贡献1810条经验 获得超5个赞
您可以轻松扩展mem装饰器以使用可变*args参数,并在memory. 这也适用于**kwargs,但您必须将它们转换为可哈希类型,frozenset例如tuples。当然,为此,所有参数都必须是可散列的。
def mem(f):
memory = {}
def inner_function(*args):
if args not in memory:
memory[args] = f(*args)
return memory[args]
return inner_function
用你的T功能测试过,工作正常。然而,在实践中,您可能仍然想使用functools.lru_cache.
添加回答
举报