为何我的Python数字根递归函数无法正常运行?
你的数字根递归函数问题分析与修复
嘿,我来帮你拆解下这个递归函数出问题的地方,一步步帮你搞定它!
问题1:多余且错误的循环破坏了原始数字
你已经通过digits = [int(d) for d in str(num)]把数字的每一位转换成整数存入数组了,但后面加的这个循环完全是画蛇添足,还直接把正确的数字覆盖了:
for n in digits: digits[x] = int(x) x = x + 1
比如输入15时,原本digits是[1,5],经过这个循环后会变成[0,1]——你把每一位数字替换成了它们的索引值,这直接导致后续计算完全错误。
问题2:累加各位数字的逻辑有误
你的第二个循环里,z的值一直是1没有递增,不管数组有多少元素,你都在重复加digits[1]:
for n in digits: digits[0] = digits[0] + digits[z]
比如输入123,原本应该计算1+2+3=6,但这个循环会把digits[0]变成1+2+2+2=7,完全不符合预期。
问题3:递归调用未返回结果
当你判断累加后的结果还是多位数时,调用了digital_root(digits[0]),但没有用return把递归的结果传递回来。这就导致递归完成后,函数没有把最终的数字根返回给上层调用,所以程序看似运行结束,却没有输出正确结果。
修复后的递归版本代码
保留你的递归思路,把错误的部分修正:
def digital_root(num): # 检查num是否为多位数 if num > 9: # 将num的各位数字转为整数数组(一步到位) digits = [int(d) for d in str(num)] # 计算各位数字的总和 total = sum(digits) # 递归调用并返回结果 return digital_root(total) else: return num # 测试验证 print(digital_root(15)) # 输出6,符合预期 print(digital_root(942)) # 输出6(9+4+2=15,1+5=6)
额外福利:更高效的数学公式法
其实数字根有个数学规律:当数字不为0时,数字根等于num % 9;如果取模结果为0且数字不为0,则返回9。用这个公式可以不用递归,一行代码搞定:
def digital_root(num): return num % 9 if num % 9 != 0 or num == 0 else 9
内容的提问来源于stack exchange,提问作者Theodore.K
相关产品推荐
相关产品推荐

