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

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:

  1. 第一次调用r(39),进入else:a=1,调用r(27)
  2. 调用r(27),进入else:a=2,调用r(14)
  3. 调用r(14),进入else:a=3,调用r(4)
  4. 调用r(4),进入if分支,返回整数3
  5. 但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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:56:00