首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使一个函数记忆2个变量函数值?

如何使一个函数记忆2个变量函数值?
EN

Stack Overflow用户
提问于 2020-10-19 17:27:43
回答 2查看 463关注 0票数 1

我希望改进值递归计算的性能。

代码语言:javascript
复制
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("*********")

但是,我只找到了通过只使用一个参数的函数来实现这一目的的方法,如:

代码语言:javascript
复制
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数组,但我还不知道(假设是可能的)这样做的想法,连同列表,会有什么帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-19 17:36:27

您可以轻松地扩展mem装饰器以处理可变的*args参数,并在memory中查找它们。这也适用于**kwargs,您必须将它们转换为可哈斯类型,例如,frozenset of tuples。当然,所有参数都必须是可理解的。

代码语言:javascript
复制
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

票数 1
EN

Stack Overflow用户

发布于 2020-10-19 17:31:46

您可以为此使用functools.lru_cache

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64432424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档