python - 避免DP的尾递归python
问题描述
我用 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)
解决方案
在不了解您的代码的情况下,我无法真正提供详细的解决方案。但是,您算法的一部分确实在我脑海中突出: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
语句的运行频率,这可能是一个主要好处。
推荐阅读
- python - 信息检索文档集阅读
- javascript - 数据表:如何选中检查状态更改?
- javascript - 一个网页中与 Javascript 相关的多种形式
- java - 让 Jackson 序列化程序覆盖特定的忽略字段
- ios - 更改自定义 UINavigationBar 属性不能完全迅速
- typescript - 如何使用 vscode api 编写异步代码(承诺?):withProgress
- mysql - sql插入查询和发布方法
- python - Lib 未从站点包中卸载 (Python)
- mysql - 在 mysql where 条件下按日期范围检查大厅可用性
- java - Mockito 如何测试匿名内部类方法?