递归判断列表降序时全局变量值异常问题求助
问题原因分析
你遇到的核心问题是函数内部未声明要修改全局变量:
- 在Python中,若函数内直接对变量赋值,Python会默认将其视为局部变量,而非修改全局同名变量。
- 你在
desOrder函数里的descending = True,实际是创建了当前递归栈中的局部变量,完全没有改动全局的descending。哪怕递归到空列表分支时设置了局部的descending=True,全局变量始终保持初始的False,所以外部判断不生效。
修复后的代码(保留全局变量写法)
只需在函数内部声明要使用全局变量即可:
descending = False def desOrder(numList): global descending # 声明使用全局变量,否则赋值会创建局部变量 if not numList: descending = True return if max(numList) == numList[0]: del numList[0] desOrder(numList) return numCopy = [5, 4, 3, 2, 1] desOrder(numCopy) if descending: print("列表为降序") # 脚本中直接return会报错,若在函数内可使用return 0
递归优化建议(摒弃全局变量)
递归的核心是通过返回值传递状态,依赖全局变量既不优雅也容易引发问题,推荐以下两种更高效的实现:
方法1:基于切片的简洁实现
def is_descending(numList): # 基线条件:空列表或单元素列表默认是降序 if len(numList) <= 1: return True # 递归条件:当前元素 >= 下一个元素,且剩余列表也满足降序 return numList[0] >= numList[1] and is_descending(numList[1:]) numCopy = [5, 4, 3, 2, 1] if is_descending(numCopy): print("列表为降序") else: print("列表非降序")
方法2:基于索引的高效实现(避免切片开销)
切片会创建新列表,对大列表有性能损耗,用索引遍历更高效:
def is_descending(numList, index=0): # 基线条件:遍历到最后一个元素,结束递归 if index >= len(numList) - 1: return True # 递归条件:当前元素 >= 下一个元素,且后续元素也满足降序 return numList[index] >= numList[index+1] and is_descending(numList, index+1)
额外优化说明
你原代码中每次调用max(numList)会遍历整个列表,导致整体时间复杂度为O(n²);而上面的优化写法仅需一次遍历,时间复杂度为O(n),效率提升明显。
内容的提问来源于stack exchange,提问作者alexion
相关产品推荐
相关产品推荐

