避免DP的尾部递归python

时间:2018-10-04 23:49:28

标签: python recursion dynamic-programming tail-recursion

我已经用Python编写了以下递归函数,用于在DP算法中计算加权区间调度问题的解决方案,其中区间为“ sorted_operations”。我正在关注Kleinberg和Tardos撰写的“算法设计”书,并且已经计算了OPT和p_list。它似乎适用于相对较小的实例,但是一旦问题的大小增加,我就会超过“最大递归深度”,并且会收到错误消息。由于增加sys.setrecursionlimit会使我的内核崩溃,所以我想知道是否还有其他方法可以编写此函数。

solution_set = []
def compute_solution(j):
    if j<=0:
       pass
    else:
        if sorted_operations[j]['weight'] + OPT[p_list[j]] > OPT[j - 1]:
            solution_set.append(sorted_operations[j])
            print(j)
            compute_solution(p_list[j])
        else:
            compute_solution(j - 1)

compute_solution(len(sorted_operations) - 1)

1 个答案:

答案 0 :(得分:1)

在不了解您的代码的情况下,我真的无法提供详细的解决方案。但是,您的算法的一部分确实在我的脑海中浮现:compute_solution(j - 1)。由于j是一个整数,所以用j - 1再次调用该算法比使用方法调用更适合循环,尤其是因为在Python中,这些开销往往有些昂贵。因此,我将像这样修改您的算法:

solution_set = []
def compute_solution(j):
    while (j > 0):
        if sorted_operations[j]['weight'] + OPT[p_list[j]] > OPT[j - 1]:
            solution_set.append(sorted_operations[j])
            print(j)
            compute_solution(p_list[j])
            return
        else:
            j = j - 1

compute_solution(len(sorted_operations) - 1)

根据运行else语句的频率,这可能是一个主要好处。