如何修复数字三角形最大路径和递归函数的索引越界错误
数字三角形最大路径递归函数索引越界修复
对应数字三角形结构参考:
需求规则:从顶点出发,每个节点可以选择往左下/右下子节点移动,每步选择值更大的子节点累加,求最终路径总和,示例预期结果为30。
报错核心原因
- 递归终止条件逻辑错误:三角形的层索引范围是
0到len(triangle)-1,原代码判断depth == len(triangle)才终止,当depth走到最后一层时,还会进入else分支访问triangle[depth+1],直接访问不存在的层触发索引越界。 - 节点定位逻辑有隐藏bug:原代码用
triangle[depth].index(N)反查当前节点的位置,list.index()只会返回匹配值的第一个索引,当同一层存在重复值时(比如示例中第3层有两个值为4的节点),会出现定位错误,就算不越界结果也会算错。 - 初始调用逻辑缺失:原代码初始total设为0,从第2层的左节点开始计算,既丢了根节点的值,也完全没遍历右子树的路径,就算不报错结果也不符合预期。
修正后的实现
直接传递当前节点的层、列索引做递归,不需要靠节点值反查位置,从根源避免越界和定位错误:
triangle = [[7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5]] def min_max(depth, col_idx): # 走到最后一层直接返回当前节点值,终止递归 if depth == len(triangle) - 1: return triangle[depth][col_idx] # 取当前节点对应的两个子节点 child_left = triangle[depth+1][col_idx] child_right = triangle[depth+1][col_idx+1] # 选值更大的子节点路径累加 return triangle[depth][col_idx] + max(min_max(depth+1, col_idx), min_max(depth+1, col_idx+1)) # 从根节点(第0层第0列)启动递归 answer = min_max(0, 0) print(answer) # 输出30,和预期结果一致
修复点说明
- 调整递归终止条件为最后一层直接返回节点值,不会再访问不存在的层索引,彻底解决越界问题。
- 移除
list.index()反查逻辑,直接传递列索引定位节点,避免重复值导致的路径计算错误。 - 去掉冗余的total传参,递归返回时自动完成值累加,不需要额外维护传入的累加变量,避免初始值设置错误。
- 从根节点启动递归,自动覆盖所有子路径选择,不需要提前拆分左右子节点单独调用。
内容的提问来源于stack exchange,提问作者jtoyhh
相关产品推荐
相关产品推荐

