【发布时间】:2021-12-04 12:19:18
【问题描述】:
我一直在尝试在我的递归 LIS 函数中实现缓存,这样它就不会两次计算相同的值。如果有人能告诉我我哪里出错了,我真的很感激。
这是返回正常工作的 LIS 数组的递归函数:
import numpy as np
def lgs(l):
return lgsRecursive(np.NINF,l,0)
def lgsRecursive(x,l,i):
print(x,i)
if i >= len(l):
return[]
else:
list1 = lgsRecursive(x,l,i+1)
if l[i] > x:
list2 = [l[i]] + lgsRecursive(l[i],l,i+1)
if len(list1) < len(list2):
list1 = list2
return list1
assert(lgs([1, 20, 3, 7, 40, 5, 2]) == [1,3,7,40])
这是相同的函数,但实现了一个缓存,它给出了重复的错误答案(在前面的断言的情况下,它返回 [1, 20, 40, 40, 40, 40, 40]):
import numpy as np
cache = {}
def lgs(l):
return lgsMemo(np.NINF,l,0)
def lgsMemo(x,l,i):
global cache
key = (x,i)
if key in cache:
return cache[(x,i)]
if i >= len(l):
return []
else:
list1 = lgsMemo(x,l,i+1)
if l[i] > x:
list2 = [l[i]] + lgsMemo(l[i],l,i+1)
if len(list1) < len(list2):
list1 = list2
cache[(l[i],i+1)] = list1
else:
cache[(x,i+1)] = list1
return list1
我认为错误可能是缓存 [l[i]] + lgsMemo(l[i],l,i+1) 而不是 lgsMemo(l[i],l,i+1)。
【问题讨论】: