You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中if条件触发return后为何无法退出循环终止递归

问题原因

你的代码无法按预期退出,核心是两个逻辑错误:

  1. 混淆了递归退出和全局终止的概念:你写的if position + 1 == len(triangle): return只会终止当前层的递归调用,不会清空整个调用栈。你在for循环里每处理一行就递归调用一次函数,触发return后只会回到上一层递归的for循环中,上层循环会继续执行、反复调用函数,自然无法终止。就算在这个判断里加break,也只能跳出当前层的循环,上层递归的循环依然会继续运行。
  2. 滥用全局变量存储递归状态: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 14:45:33