为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

跃然一笑 2023-12-05 15:49:40
我想提高递归计算值的性能n = 100def 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@memdef fibonacci(n):    if n == 1 or n == 0:        return 1    else:        return fibonacci(n-1) + fibonacci(n-2)我正在考虑做一个二维数组,但我还不知道(假设这是可能的)使用列表列表这样做的想法会有什么帮助。
查看完整描述

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


查看完整回答
反对 回复 2023-12-05
?
森栏

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.


查看完整回答
反对 回复 2023-12-05
  • 2 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信