Python中if条件触发return后为何无法退出循环终止递归
问题原因
你的代码无法按预期退出,核心是两个逻辑错误:
- 混淆了递归退出和全局终止的概念:你写的
if position + 1 == len(triangle): return只会终止当前层的递归调用,不会清空整个调用栈。你在for循环里每处理一行就递归调用一次函数,触发return后只会回到上一层递归的for循环中,上层循环会继续执行、反复调用函数,自然无法终止。就算在这个判断里加break,也只能跳出当前层的循环,上层递归的循环依然会继续运行。 - 滥用全局变量存储递归状态:
total/index/skip/position全是全局变量,所有层级的递归调用共享这几个值,状态会被反复修改,就算退出逻辑写对了,计算结果也会出错。
另外你的代码还有两处冗余/错误:
max_value里的for循环完全没有作用,进入循环第一次迭代就会return,循环根本不会重复执行- 你当前用的每步选相邻最大值的贪心思路本身就有缺陷,无法得到全局最优的最大路径和。
修正方案
1. 保留原有贪心逻辑、可正常退出的版本
直接删掉无意义的递归调用,改成纯迭代实现,不需要全局变量,逻辑清晰不会出现无法退出的问题:
def max_value(row, index): maximum = max(row[index], row[index + 1]) next_index = index if maximum == row[index] else index + 1 return {"max": maximum, "next_index": next_index} def sliding_triangle(triangle): total = triangle[0][0] current_index = 0 # 逐行迭代即可,不需要递归 for row_idx in range(1, len(triangle)): value_res = max_value(triangle[row_idx], current_index) total += value_res["max"] current_index = value_res["next_index"] return total # 测试调用 print(sliding_triangle([ [75], [95, 64], [17, 47, 82], [18, 35, 87, 10], [20, 4, 82, 47, 65], [19, 1, 23, 75, 3, 34], [88, 2, 77, 73, 7, 63, 67], [99, 65, 4, 28, 6, 16, 70, 92], [41, 41, 26, 56, 83, 40, 80, 70, 33], [41, 48, 72, 33, 47, 32, 37, 16, 94, 29], [53, 71, 44, 65, 25, 43, 91, 52, 97, 51, 14], [70, 11, 33, 28, 77, 73, 17, 78, 39, 68, 17, 57], [91, 71, 52, 38, 17, 14, 91, 43, 58, 50, 27, 29, 48], [63, 66, 4, 68, 89, 53, 67, 30, 73, 16, 69, 87, 40, 31], [ 4, 62, 98, 27, 23, 9, 70, 98, 73, 93, 38, 53, 60, 4, 23], ]))
2. 正确计算三角形最大路径和的动态规划版本
贪心算法每一步选局部最大值,无法得到全局最优结果,要算正确的最大路径和建议用从下往上的动态规划实现,没有递归、全局变量问题,性能也更高:
def max_path_sum(triangle): # 初始化dp数组为最后一行的值 dp = triangle[-1].copy() # 从倒数第二行开始往上累加 for i in range(len(triangle)-2, -1, -1): for j in range(len(triangle[i])): dp[j] = triangle[i][j] + max(dp[j], dp[j+1]) return dp[0]
内容的提问来源于stack exchange,提问作者Sonny49
相关产品推荐
相关产品推荐

