Heron法求平方根代码迭代偏移与List索引越界问题如何修复
海伦法平方根代码修正方案
问题根源
- 迭代偏移问题:初始状态错误提前向x数组插入了未经过海伦公式计算的
a/x0值,导致索引1对应的值并非第一次迭代的正确结果,迭代序号整体后移。同时循环逻辑中先计算变化量再更新估计值的顺序不符合预期输出要求。 - 索引越界问题:当相邻迭代的变化量小于容差
tol后,代码停止向x数组追加新元素,但for循环仍会继续执行到max_iter次,后续i超过x数组长度时访问x[i]就会触发越界报错。 - 隐藏问题:原函数没有
return返回最终估计值,调用后x_final会得到None。
修正后的完整代码
# Problem 1. def square_root_for(a, x0, max_iter = 10, tol=1e-14): """ (number, integer, number) -> float Return an estimate of the square root of a number using the Heron's method. >>> square_root_for(5, 5) Iteration | Estimate | Relative Change ------------------------------------------------- 1 | 3.00000000000000 | 0.4000000000000000 2 | 2.33333333333333 | 0.2222222222222222 3 | 2.23809523809524 | 0.0408163265306123 4 | 2.23606889564336 | 0.0009053870529653 5 | 2.23606797749998 | 0.0000004106060359 6 | 2.23606797749979 | 0.0000000000000842 7 | 2.23606797749979 | 0.0000000000000000 2.23606797749979 """ x_prev = x0 print('Iteration | Estimate | Relative Change') print('-------------------------------------------------') for i in range(1, max_iter + 1): # 计算当前迭代的估计值 x_current = (x_prev + a / x_prev) / 2 # 计算相对变化量 change = abs(x_current - x_prev) / x_prev # 输出当前迭代结果 print('{} | {:.14f} | {:.16f}'.format(i, x_current, change)) # 达到容差要求提前终止 if change <= tol: break # 更新上一次估计值为当前值,用于下一次迭代 x_prev = x_current # 返回最终估计值 return x_current # Don't change or delete the 5 lines of code below. a = 5 max_iter = 100 tol = 1e-15 x_final = square_root_for(a, a, max_iter, tol) print('Final estimate using square_root_for is {0}'.format(x_final))
修正说明
- 取消了用列表存储所有历史估计值的逻辑,改用两个变量分别存储上一轮和当前轮的估计值,从根源上避免索引越界问题,同时减少内存占用。
- 调整了迭代计算顺序,每次循环先计算当前轮的估计值和变化量,输出后判断是否达到终止条件,完全匹配示例的迭代序号与输出内容。
- 补充了
return语句,返回最终的估计值,避免调用后得到None的问题。 - 增加了容差达标后的
break逻辑,无需执行多余的迭代,运行效率更高。
内容的提问来源于stack exchange,提问作者ashnotallyson
相关产品推荐
相关产品推荐

