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

使用global关键字后全局变量未返回?递归函数返回NoneType问题

递归函数返回None的原因及修复方案

你的问题出在递归调用时没有返回结果:在elif和else分支里,你调用了number_of_steps(num),但没有用return把这个调用的结果传递回去。只有最底层触发num == 0的分支返回了counter,但上层的函数调用没有把这个值往上传,最终顶层调用就会返回None。

修复方案1:保留全局变量,补全return

先给递归调用加上return,同时把除法改成整数除法(避免出现浮点数影响后续判断):

counter = 0
def number_of_steps(num):
    global counter
    if num == 0:
        return counter
    elif num % 2 == 0:
        num = num // 2  # 整数除法,确保num始终是整数
        counter += 1
        return number_of_steps(num)  # 传递递归结果
    else: 
        num -= 1
        counter += 1
        return number_of_steps(num)  # 传递递归结果

print(number_of_steps(2))  # 输出2,符合预期

不过全局变量有个致命问题:多次调用函数时,counter不会自动重置。比如先调用number_of_steps(2),再调用number_of_steps(1),会得到3而不是1。更合理的做法是去掉全局变量,用递归参数传递步数。

修复方案2:移除全局变量,用参数传递状态

把步数作为函数参数,每次递归时更新,这样每次调用都是独立的,不会有状态污染:

def number_of_steps(num, counter=0):
    if num == 0:
        return counter
    elif num % 2 == 0:
        return number_of_steps(num // 2, counter + 1)
    else:
        return number_of_steps(num - 1, counter + 1)

print(number_of_steps(2))  # 输出2
print(number_of_steps(1))  # 输出1,不受之前调用影响

这个版本更符合递归的设计逻辑,代码更简洁也更可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 18:45:22