如何让一个函数记住2个变量函数值?

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

我想提高值的递归计算的性能

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("*********")

但是,我只找到了使用仅接受 1 个参数的函数来执行此操作的方法,如下所示:

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)

我正在考虑做一个二维数组,但我还不知道(假设这是可能的)用列表列表来这样做的想法会有什么帮助。

python list function recursion memoization
3个回答
2
投票

您可以使用

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)
调用),您的代码将几乎立即完成。
    


1
投票
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
    


0
投票

#suppose you have a 2 input function memo = {} def my_function(a, b): result = None #you can store multiple results of the recursion into the dict with different keys memo[a] = result memo[b] = result #your function modified will be n = 100 memo = {} def T(n,k): if n in memo: return n elif k in memo: return k result = 0 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: result = (T(n-1,k-1)+n*T(n-1,k)) memo[n] = result memo[k] = result return result for i in range(n): for n in range(i+1): print(T(i,n)) print("*********")

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