【问题标题】:Memoization and strings记忆和字符串
【发布时间】:2021-06-17 13:25:52
【问题描述】:

我有两个字符串 X1X2 和一个lambda_ 参数,我想使用以下代码通过递归两个字符串的大小来计算一个函数:

def Bk_function(X1,X2,lambda_,k):
    #lambda=0.01
    #k=5
    if k==0:
        return 1
    if min(len(X1),len(X2))<k:
        return 0
    else:
        return (lambda_*Bk_function(X1[:-1],X2,lambda_,k) + lambda_*Bk_function(X1,X2[:-1],lambda_,k)
                + lambda_**2*(-Bk_function(X1[:-1],X2[:-1],lambda_,k) + (X1==X2)*Bk_function(X1[:-1],X2[:-1],lambda_,k-1)))

尽管如此,由于计算时间太重要了,我打算使用以下代码进行记忆步骤:

def Bk_function(X1,X2,lambda_,k):
    if not (bool(memo.get(k))):
        if k==0:
            memo[k] = 1
        if min(len(X1),len(X2))<k:
            memo[k] = 0
        else:
            memo[k] = (lambda_*Bk_function(X1[:-1],X2,lambda_,k) + lambda_*Bk_function(X1,X2[:-1],lambda_,k)
                    + lambda_**2*(-Bk_function(X1[:-1],X2[:-1],lambda_,k) + (X1==X2)*Bk_function(X1[:-1],X2[:-1],lambda_,k-1)))
    return memo[k]

即我们将已经在关联数组/字典中计算的值保存在内存中。但是我不知道是应该将memo字典定义为全局变量,还是将其作为参数传递给函数Bk_function(X1,X2,lambda_,k, memo={})或者在程序开头写memo={}。谢谢!

【问题讨论】:

    标签: python string dictionary recursion memoization


    【解决方案1】:

    你可以定义你在问题中提到的函数。

    def Bk_function(X1,X2,lambda_,k, memo={})
    

    但是当你调用函数时你不需要将它作为参数传递,因为将使用函数定义中的同一个字典。只是为了演示尝试运行以下示例代码。

    def test(k, v, data={}):
        data[k] = v
        print(data)
        return v
    
    
    test('first', 1)
    test('second', 2)
    test('third', 1)
    

    【讨论】:

      猜你喜欢
      • 2010-09-23
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 2013-01-08
      • 2012-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多