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

递归计算列表深度时的全局变量问题及代码修复咨询

修复基于全局变量的列表深度递归函数

你的代码存在两个核心问题导致重复调用结果错误:

  1. 全局变量depth未在每次首次调用时重置,第二次调用时会沿用上次累积的数值;
  2. 递归逻辑缺少回溯处理,进入子列表时深度加1,但返回父列表时未将深度减回原值,同时过早return导致没有遍历所有元素并跟踪最大深度。

修复后的全局变量版本

我们可以引入两个全局变量:一个跟踪当前递归的深度,另一个记录遍历过程中的最大深度,同时在首次调用时重置变量,并在递归返回时做回溯:

current_depth = 1
max_depth = 1

def list_depth(arr, is_first_call=True):
    global current_depth, max_depth
    # 首次调用时重置全局变量
    if is_first_call:
        current_depth = 1
        max_depth = 1
    for element in arr:
        if isinstance(element, list):
            current_depth += 1
            # 更新最大深度
            if current_depth > max_depth:
                max_depth = current_depth
            # 递归处理子列表,标记为非首次调用
            list_depth(element, is_first_call=False)
            # 回溯:从子列表返回后,深度减1
            current_depth -= 1
    return max_depth

# 测试调用
print(list_depth([1, [2, [3, [4, [5, [6], 5], 4], 3], 2], 1])) # => 6
print(list_depth([1, [2, [3, [4, [5, [6], 5], 4], 3], 2], 1])) # => 6

为什么原代码会出错?

  • 原代码中depth是全局变量,第二次调用函数时不会自动重置,导致从上次的结果(6)继续累加;
  • 递归进入子列表时depth +=1,但返回父列表时没有depth -=1,每次递归都会让深度持续增加;
  • 原代码在遇到第一个列表元素后就直接return depth,没有遍历所有元素确认是否存在更深的子列表,逻辑上存在漏洞(只是你的测试用例刚好第一个列表是最深的,才让首次调用结果正确)。

更推荐的无全局变量版本

全局变量在递归中容易引发状态混乱,更简洁可靠的方式是让递归函数直接返回当前子列表的深度,通过局部变量跟踪最大值:

def list_depth(arr):
    max_depth = 1
    for element in arr:
        if isinstance(element, list):
            # 子列表的深度是1(当前层)加上子列表自身的深度
            sub_depth = 1 + list_depth(element)
            if sub_depth > max_depth:
                max_depth = sub_depth
    return max_depth

# 测试调用
print(list_depth([1, [2, [3, [4, [5, [6], 5], 4], 3], 2], 1])) # => 6
print(list_depth([1, [2, [3, [4, [5, [6], 5], 4], 3], 2], 1])) # => 6

这个版本无需全局变量,每次调用都是独立的状态,递归逻辑更清晰,也不会出现重复调用错误。

内容的提问来源于stack exchange,提问作者Sherlock1996

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 11:27:05