Python双重while循环实现平方根计算逻辑错误排查
平方根估算代码逻辑Bug修复
问题背景
编写了包含双重while循环的平方根估算代码,运行异常,逻辑复杂度较高存在隐藏bug,原实现代码如下:
import math print("How many numbers am I estimating John?") count = int(input("COUNT> ")) print("Input each number to estimate.") better_guess = 0 initial_guess = 10 i = 0 j = 0 t = 1 list = [] for j in range(count): num = float(input("NUMBER> ")) list.append(num) j = j + 1 if j == count: print("The square roots are as follows:") while i <= len(list): while t != 0 : initial_guess = 10 better_guess = (initial_guess + (list[i])/initial_guess) / 2 if initial_guess == better_guess: print(f"OUTPUT After {t} iterations, {list[i]}^0.5 = {better_guess}") i = i + 1 break initial_guess = better_guess i = i + 1
核心Bug点
- 索引逻辑错误:外层for循环手动执行
j = j +1属于冗余操作,for j in range(count)会自动完成索引迭代,手动修改会打乱迭代节奏;外层while循环判断条件i <= len(list)会触发列表索引越界,列表合法索引范围为0到len(list)-1。 - 内层循环逻辑失效:每次进入内层while循环都会将
initial_guess重置为10,无法使用上一轮迭代得到的better_guess更新猜测值,永远无法收敛到正确结果;迭代计数变量t从未做自增操作,既无法统计真实迭代次数,t !=0的循环终止条件也完全不生效。 - 浮点数判断逻辑错误:直接用
==判断两个浮点数相等,很容易因为浮点精度问题触发死循环,实际应该设置精度阈值(比如差值小于1e-8)判断是否收敛。 - 变量初始化位置错误:初始猜测值
initial_guess、迭代计数t的初始化放在了全局位置,处理完第一个待开方数后变量残留值会干扰后续数字的计算,应该放在每个数字计算的循环内部初始化。 - 缩进错误:原代码中
initial_guess = better_guess行缩进不匹配,会直接触发语法报错。
修正后可运行代码
import math print("How many numbers am I estimating John?") count = int(input("COUNT> ")) print("Input each number to estimate.") num_list = [] # 收集待计算数字,移除冗余的手动索引自增逻辑 for _ in range(count): num = float(input("NUMBER> ")) num_list.append(num) print("The square roots are as follows:") i = 0 # 修正索引越界问题,用<代替<= while i < len(num_list): # 每个数字计算前单独初始化变量,避免前序计算值残留干扰 initial_guess = 10 t = 1 # 设置收敛阈值,避免浮点数精度问题导致死循环 while True: better_guess = (initial_guess + num_list[i]/initial_guess) / 2 # 差值小于阈值即判定为收敛 if abs(better_guess - initial_guess) < 1e-9: print(f"OUTPUT After {t} iterations, {num_list[i]}^0.5 = {better_guess}") break initial_guess = better_guess t += 1 i += 1
内容的提问来源于stack exchange,提问作者Lidiga SImin
相关产品推荐
相关产品推荐

