我希望改进值递归计算的性能。
n = 100
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))
for i in range(n):
for n in range(i+1):
print(T(i,n))
print("*********")但是,我只找到了通过只使用一个参数的函数来实现这一目的的方法,如:
def mem(f):
memory = {}
def inner_function(x):
if x not in memory:
memory[x] = f(x)
return memory[x]
else:
return memory[x]
return inner_function
@mem
def fibonacci(n):
if n == 1 or n == 0:
return 1
else:
return fibonacci(n-1) + fibonacci(n-2)我正在考虑做一个2d数组,但我还不知道(假设是可能的)这样做的想法,连同列表,会有什么帮助。
发布于 2020-10-19 17:36:27
您可以轻松地扩展mem装饰器以处理可变的*args参数,并在memory中查找它们。这也适用于**kwargs,您必须将它们转换为可哈斯类型,例如,frozenset of 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。
发布于 2020-10-19 17:31:46
您可以为此使用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)调用),您的代码将几乎立即完成。
https://stackoverflow.com/questions/64432424
复制相似问题