Python实现指定范围factorion查找时返回空列表的问题排查
factorion查找代码的Bug定位与修正
根本原因
代码存在循环变量被意外覆写的核心问题,完全破坏了判断逻辑:
for i in range(a, b)遍历到的i是当前需要校验的原始数值- 后续数位拆分逻辑直接对
i本身执行取余、整除操作:反复将i除以10取整,直到i被修改为0才终止循环 - 等各位阶乘和计算完成时,原本待对比的
i早已被改成0,此时判断条件sum == i实际是在对比“阶乘和是否等于0”,自然永远不会匹配到1、2、145这类有效结果,最终返回空列表。
举个实际执行的例子:当遍历到i=145时,经过数位拆分流程,i会被逐步运算为145 →14 →1 →0,最终阶乘和计算为145,判断条件变成145 == 0,显然无法触发收集逻辑。
修正方法
数位拆分操作不要直接修改循环用的i,改用独立的临时变量承载拆分过程即可,修正后的核心代码片段:
def factorion(a, b): factorions = [] for i in range(a, b): atom = [] # 用临时变量保存当前数值,避免覆写循环变量 current_num = i while current_num != 0: atom.append(current_num % 10) current_num = current_num // 10 fact_sum = 0 for digit in atom: fact_sum += factorial(digit) if fact_sum == i: factorions.append(i) return factorions
修正后运行factorion(1, 1000),就能正确返回预期结果[1, 2, 145]。
性能优化提示:0-9的阶乘结果是固定常量,可以提前预存为列表,省去循环中重复调用阶乘函数的开销,对大范围查找效率提升明显。
内容的提问来源于stack exchange,提问作者Shahryar Khan
相关产品推荐
相关产品推荐

