使用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
相关产品推荐
相关产品推荐

