递归计算列表深度时的全局变量问题及代码修复咨询
修复基于全局变量的列表深度递归函数
你的代码存在两个核心问题导致重复调用结果错误:
- 全局变量
depth未在每次首次调用时重置,第二次调用时会沿用上次累积的数值; - 递归逻辑缺少回溯处理,进入子列表时深度加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
相关产品推荐
相关产品推荐

