猿问

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

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


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)

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


跃然一笑
浏览 111回答 2
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)调用),您的代码将几乎立即完成。

森栏

您可以轻松扩展mem装饰器以使用可变*args参数,并在memory. 这也适用于**kwargs,但您必须将它们转换为可哈希类型,frozenset例如tuples。当然,为此,所有参数都必须是可散列的。def mem(f):&nbsp; &nbsp; memory = {}&nbsp; &nbsp; def inner_function(*args):&nbsp; &nbsp; &nbsp; &nbsp; if args not in memory:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; memory[args] = f(*args)&nbsp; &nbsp; &nbsp; &nbsp; return memory[args]&nbsp; &nbsp; return inner_function用你的T功能测试过,工作正常。然而,在实践中,您可能仍然想使用functools.lru_cache.
随时随地看视频慕课网APP

相关分类

Python
我要回答