Python用海伦法求平方根的for/while循环输出错误排查
海伦法估算平方根输出异常排查与解决方案
排查思路
- 核对海伦法迭代逻辑是否正确:海伦法求数
n的平方根的核心公式为next_guess = (current_guess + n / current_guess) / 2,你当前输出迭代1估计值为1.0,说明你误将迭代前的初始猜测值当成了第一次迭代的输出结果,迭代计数整体提前了一个步长。 - 检查相对变化计算逻辑:相对变化的标准公式为
|当前估计值 - 上一次估计值| / |上一次估计值|,你输出的迭代2相对变化为2.0,刚好符合|3.0 - 1.0| / |1.0|的计算结果,说明你把初始值当成了迭代1的估计值,第一次迭代计算得到的3.0被误算成了迭代2的结果。 - 检查结果存储的时机:你当前的代码逻辑大概率是先把初始值append到结果列表,再执行迭代计算,导致首次append的内容是迭代前的初始值,和后续迭代完成后再append的逻辑不一致,刚好对应老师提示的问题点。
错误逻辑复现
你现有代码的逻辑应该和下方示例一致:
n = 5 # 以你作业中需要计算的被开方数为准 guess = 1.0 # 初始猜测值 results = [] iter_count = 0 # 错误逻辑:先存值再计算 while iter_count < 5: iter_count += 1 # 先把当前guess存入结果,第一次存的就是初始值1.0,对应你输出的迭代1结果 results.append( (iter_count, guess) ) next_guess = (guess + n / guess) / 2 rel_change = abs(next_guess - guess)/abs(guess) guess = next_guess
修复方案
调整计算和存储的顺序,迭代计算完成后再存储当前迭代的结果,示例如下:
n = 5 # 替换为实际需要计算的被开方数 guess = 5.0 # 按作业要求设置初始猜测值,对应示例中迭代1得到3.0的初始值 results = [] max_iter = 10 tolerance = 1e-15 iter_count = 0 while iter_count < max_iter: iter_count += 1 # 先执行迭代计算 next_guess = (guess + n / guess) / 2 rel_change = abs(next_guess - guess) / abs(guess) # 计算完成后再存储当前迭代的结果 results.append( (iter_count, next_guess, rel_change) ) guess = next_guess if rel_change < tolerance: break # 输出验证 for iter_num, est, rel in results: print(f"迭代{iter_num}:估计值{est:.14f},相对变化{rel:.16f}")
以上代码首次迭代输出的估计值为3.0、相对变化为0.4,和作业示例完全匹配。如果需要用for循环实现,只需要把while的终止条件替换为固定迭代次数即可,核心存储逻辑不变。
额外检查点
- 确认初始猜测值的设置和作业要求一致,多数作业会指定海伦法的初始猜测值为被开方数本身,不要自行修改。
- 相对变化的分母必须是上一次迭代的估计值,不要替换为当前迭代的估计值,否则会出现相对变化计算错误。
内容的提问来源于stack exchange,提问作者ashnotallyson
相关产品推荐
相关产品推荐

