快乐数检测Python函数返回None问题排查(以19为例)
为什么我的快乐数递归函数返回None?
你遇到的问题很典型——递归调用时没有返回递归函数的结果,导致除了直接得到sum=1的情况外,其他所有递归分支都会默认返回None。
我们来拆解一下你的代码执行流程(以输入19为例):
happy(19)计算得到sum=82,不等于1,于是调用happy(82),但这里没有写return happy(82)happy(82)计算sum=68,同样调用happy(68),也没返回结果happy(68)计算sum=100,调用happy(100),还是没返回happy(100)计算sum=1,返回True,但这个True没有被传递回上一层的happy(68),更别说最外层的happy(19)了- 最外层的
happy(19)执行完else分支后,没有任何return语句,Python函数默认返回None
修正后的递归代码
只需要在else分支里加上return,把递归调用的结果逐层返回回去就行:
def happy(n): s = list(str(n)) sum = 0 for i in s: sum += int(i)**2 if sum == 1: return True else: # 关键:返回递归调用的结果 return happy(sum) if __name__=="__main__": n = int(input()) result = happy(n) print(result) print("True" if result else "False")
另外优化了一个小细节:把happy(n)的结果存到变量里,避免重复调用函数做相同计算。
额外提示:避免无限递归
如果输入的是非快乐数(比如2),你的递归会无限进行下去,因为会进入循环。可以用哈希集合检测重复的sum值,提前判断循环:
def happy(n): seen = set() while n != 1 and n not in seen: seen.add(n) sum_sq = 0 for digit in str(n): sum_sq += int(digit)**2 n = sum_sq return n == 1
内容的提问来源于stack exchange,提问作者Saurabh Sahu
相关产品推荐
相关产品推荐

