繁体   English   中英

Python:最大递归深度错误

[英]Python: Maximum recursion depth error

我在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%迭代而不是递归? 谢谢

要删除递归,您需要迭代使用函数。

对于添加到列表,这很容易。 这样的事情应该有效。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM