为何if-else块未按预期多次运行?MDR与乘法持久性计算异常求助
修复乘法数字根与持久性计算的问题
你的代码主要问题在于递归没有持续执行到结果小于10,而且计数器c只累加了一次,同时函数的职责划分不够清晰,导致流程中断。我们一步步来修复:
问题拆解
- 递归仅执行一次:你的
if res>=10块里只调用了一次prodDigits(res1),没有继续递归或者循环处理新的结果,所以到32就停了。 - 计数器未正确累加:
c在函数里只加了1,后续递归调用不会更新这个计数器,所以持久性永远是1。 - 函数职责混乱:
MDR函数同时做了计算根、计算持久性、打印的事情,Mpersistence只是调用MDR,没有单独完成自己的职责。 - 输入处理问题:输入的
num是字符串,直接传给prodDigits虽然能转,但最好提前转成整数避免潜在问题。
修复后的代码
我们把三个函数的职责明确分开:
prodDigits:仅负责计算数字各位的乘积,不做其他操作MPersistence:负责计算乘法持久性(递归/循环次数),同时跟踪最终的根MDR:基于MPersistence的结果返回乘法数字根
def prodDigits(num): # 计算数字各位的乘积,保持单一职责 product = 1 for digit in str(num): product *= int(digit) return product def MPersistence(num): count = 0 current_num = num # 循环直到当前数字小于10 while current_num >= 10: current_num = prodDigits(current_num) count += 1 # 返回持久性次数和最终的数字根 return count, current_num def MDR(num): # 调用MPersistence获取数字根 _, root = MPersistence(num) return root # 主程序入口 if __name__ == "__main__": num = int(input("Enter the number: ")) persistence, root = MPersistence(num) print(f"MDR is {root}") print(f"Multiplicative Persistence is {persistence}")
代码解释
- prodDigits函数:只专注于计算各位乘积,返回结果不打印,方便被其他函数重复调用。
- MPersistence函数:用
while循环替代单次递归,每次更新当前数字并累加计数器,直到数字小于10,最后返回次数和根,逻辑更直观。 - MDR函数:仅提取
MPersistence返回的根,严格符合它的职责定位。 - 输入处理:提前将输入转为整数,避免字符串处理的潜在异常。
测试输入86的结果
运行后输入86,输出会是:
Enter the number: 86 MDR is 6 Multiplicative Persistence is 3
完全符合预期流程:86→48→32→6,持久性为3次。
如果你更倾向于递归实现MPersistence,也可以用这个版本:
def MPersistence(num, count=0): if num < 10: return count, num return MPersistence(prodDigits(num), count + 1)
递归版本同样能正确计算次数和根,调用方式和循环版一致。
内容的提问来源于stack exchange,提问作者Asmita
相关产品推荐
相关产品推荐

