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

递归判断列表降序时全局变量值异常问题求助

问题原因分析

你遇到的核心问题是函数内部未声明要修改全局变量:

  • 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 05:13:19