我遇到了超出最大递归深度的问题'在python中
我将一个java(我不知道java,因此它不容易)转换为python函数,它确实适用于小型列表但是当我使用大型列表时,我得到了这个错误。我试图做sys.setrecursionlimit(10000)
但似乎有一个问题,因为它无法完成,可能是因为我以错误的方式将java代码转换为python。
这是函数的python代码
def fun(a, b):
inf = 10000
c=[]
boolean = [[0 for x in xrange(len(b))] for x in xrange(len(a))]
dp = [[inf for x in xrange(len(b))] for x in xrange(len(a))]
def maxMatching(i, j):
if i == -1:
return 0
if j == -1:
return inf
if dp[i][j] != inf:
return dp[i][j]
val1 = maxMatching(i, j - 1)
val2 = abs(a[i] - b[j]) + maxMatching(i - 1, j - 1)
if cmp(val1, val2) > 0:
dp[i][j] = val2
boolean[i][j] = True
else:
dp[i][j] = val1
return dp[i][j]
def add_to_list(i, j):
if i == -1 or j == -1:
return
if boolean[i][j]:
c.append(b[j])
add_to_list(i - 1, j - 1)
else:
add_to_list(i, j - 1)
maxMatching(len(a) - 1, len(b) - 1)
add_to_list(len(a) - 1, len(b) - 1)
return sorted(c, reverse=True)
a=[20, 19, 13]
b=[21, 20, 14, 11, 5]
c=fun(a, b)
assert c == [21, 20, 14]
该函数应该从列表b返回一个列表,它是列表a中最近的点 我认为将此函数转换为迭代将解决问题 我的问题是,如何使该功能100%迭代而不是递归? 感谢
答案 0 :(得分:1)
要删除递归,您需要迭代使用函数。
对于添加到列表,这很容易。这样的事情应该有效。
def add_to_list(i, j):
while i != -1 and j == -1:
if boolean[i][j]:
c.append(b[j])
i = i - 1
j = j - 1
else:
j = j - 1
对于maxMatching,这也是可能的,但需要更多的工作。但是,您是否注意到您的递归从左上角到右下角构建了dp表?并且您使用dp的值来计算maxMatching值在右侧和底部的更多值?
所以你可以做的是创建一个帮助表(如dp和boolean)并从上到下和从左到右构造它。对于每个单元格,您可以像现在一样根据值计算值,但不使用递归,而是使用辅助表中的值。
此方法称为动态编程,它基于较小问题的解决方案构建解决方案。可以使用动态编程来解决使用某种形式的数学再现来定义的许多问题。有关更多示例,请参阅http://en.wikipedia.org/wiki/Dynamic_programming。