求实现:重复减去数字反射值直至归零的Python代码
实现「减去自身反射值」的收敛验证逻辑
循环实现方案
循环是更稳妥的选择,能避免递归深度过大导致的栈溢出问题。结合你提供的反射值函数,完整验证代码如下:
def r(n): r = 0 while n > 0: r *= 10 r += n % 10 n //= 10 return r def verify_convergence(num): current = abs(num) seen = set() print(f"初始值: {num}") while current != 0: if current in seen: print(f"检测到循环,无法收敛至0,当前数: {current}") return False seen.add(current) reflected = r(current) diff = current - reflected print(f"{current} - {reflected} = {diff}") current = abs(diff) print("最终收敛至0") return True # 测试示例中的275 verify_convergence(275)
代码说明
- 取绝对值
abs(num):减法结果可能为负数,但负数的反射值与绝对值的反射值一致,简化后续计算 seen集合:记录已出现的数值,避免进入无限循环(若数值重复出现,说明无法收敛到0)- 每一步打印计算过程,方便跟踪验证流程
递归实现方案
如果偏好递归写法,也可以实现,但需注意Python默认递归深度限制(约1000层),大数测试建议用循环版本:
def r(n): r = 0 while n > 0: r *= 10 r += n % 10 n //= 10 return r def verify_convergence_recursive(num, seen=None): current = abs(num) if seen is None: seen = set() print(f"初始值: {num}") if current == 0: print("最终收敛至0") return True if current in seen: print(f"检测到循环,无法收敛至0,当前数: {current}") return False seen.add(current) reflected = r(current) diff = current - reflected print(f"{current} - {reflected} = {diff}") return verify_convergence_recursive(diff, seen) # 测试示例中的275 verify_convergence_recursive(275)
内容的提问来源于stack exchange,提问作者BambaBah
相关产品推荐
相关产品推荐

