Python函数返回值疑问:为何r(n)类型为NoneType而非整数?
问题原因分析
咱们直接拆解你的r函数逻辑——问题核心出在递归分支的返回值传递缺失上:
def r(x): global a if len(str(x))==1: print(a) b=int(a) a=0 return b # 这里确实返回了整数b else: a+=1 print(a) r(reduce(lambda z, y: int(z)*int(y), list(str(x)))) # 这里只调用了r,但没返回它的结果!
当你调用r(n)且n不是个位数时,函数会进入else分支:它会递增a、打印数值,然后递归调用r处理乘积后的数,但这个分支没有任何return语句。
举个具体例子,比如n=39:
- 第一次调用
r(39),进入else:a=1,调用r(27) - 调用
r(27),进入else:a=2,调用r(14) - 调用
r(14),进入else:a=3,调用r(4) - 调用
r(4),进入if分支,返回整数3 - 但
r(14)的else分支只是调用了r(4),没有把3返回给上层;同理r(27)、r(39)的else分支都没有传递这个返回值,所以这些上层调用执行完后,默认返回None
这就是为什么type(r(n))是NoneType——只有最底层的递归调用返回了整数,但上层调用没有把这个结果传递出来。
修复方案
只需要在else分支的递归调用前加上return,让递归的返回值逐层传递回去:
from functools import reduce # 别忘了导入reduce! a=0 def r(x): global a if len(str(x))==1: print(a) b=int(a) a=0 return b else: a+=1 print(a) return r(reduce(lambda z, y: int(z)*int(y), list(str(x)))) # 加上return def persistence(n): if len(str(n))==1: return 0 else: return r(n)
这样,当最底层的r返回整数时,每一层的递归调用都会把这个值返回给上层,最终r(n)就会返回正确的整数类型了。
另外提个小建议:使用全局变量a来计数不是很优雅,你可以把计数作为递归参数传递,避免全局变量的副作用,比如:
from functools import reduce def persistence(n): def r(x, count): if len(str(x)) == 1: return count product = reduce(lambda z, y: int(z)*int(y), list(str(x))) return r(product, count + 1) return r(n, 0) if len(str(n)) > 1 else 0
这个版本不需要全局变量,逻辑更清晰,也不会有状态残留的问题。
内容的提问来源于stack exchange,提问作者user8568440
相关产品推荐
相关产品推荐

