Python三角形边角求解程序非预期无限循环问题排查求助
问题根因
死循环问题核心是两点:
eqfinder函数的形参a、b、c是调用时从eqdict解包传入的局部静态副本,后续你更新全局eqdict的值时,已经进入eqfinder函数的这几个局部参数不会同步更新,所以c+a+b==2的判断会一直成立,不断触发求解逻辑。- 求解后递归调用
eqfinder的逻辑和eqfinder内部的while循环叠加,既会导致调用栈不断加深,也不会刷新上层eqfinder的局部参数值,循环永远无法退出。
修复方案
- 移除
eqfinder的所有入参,判断已知参数数量时直接读取全局eqdict的最新值,避免静态副本带来的状态不一致问题。 - 去掉递归调用
eqfinder的逻辑,仅保留eqfinder内部的循环,每次循环都重新读取最新的参数状态,直到没有可求解的项就退出。 - 求解函数
cab、posangles也直接读取全局terms、eqdict的当前值,不需要传参,避免传旧值的问题。
修复后可运行代码
import math def main(): global terms terms={"a":[0,0],"b":[0,0],"c":[0,0],"aa":[0,0],"ba":[0,0],"ca":[0,0]} selectterms() def selectterms(): """接收用户输入的已知参数""" doneterm=False while not doneterm: print("请选择要输入的变量名,输入完成后直接按回车开始计算") term1=input("变量名: ") if term1=="": doneterm=True appender() if not doneterm: term2=float(input("数值: ")) terms[term1]=[term2, 1] return def saveanswer(term,num): """保存求解结果到terms和eqdict""" print(f"求解完成:{term} = {num}") terms[term][1]=1 terms[term][0]=num eqdict[term]=1 def appender(): """初始化eqdict字典""" global eqdict eqdict={} for key in terms.keys(): eqdict[key]=int(terms[key][1]) eqfinder() return def eqfinder(): """遍历参数查找可求解的方程""" while True: # 先处理负角度 if terms["aa"][0]<0 or terms["ba"][0]<0 or terms["ca"][0]<0: posangles() continue # 判断勾股定理可解条件:三个边长已知2个 side_known = eqdict["a"] + eqdict["b"] + eqdict["c"] if side_known == 2: cab() continue # 没有可解的项就退出 break # 输出最终结果 print("\n所有可求解参数结果:") for k,v in terms.items(): print(f"{k} = {v[0]}") def posangles(): """将负角度转为正""" if terms["aa"][0]<0: saveanswer("aa", abs(terms["aa"][0])) elif terms["ba"][0]<0: saveanswer("ba", abs(terms["ba"][0])) elif terms["ca"][0]<0: saveanswer("ca", abs(terms["ca"][0])) def cab(): """勾股定理求解缺失边长""" if eqdict["c"] == 0: c_val = math.sqrt(terms["a"][0]**2 + terms["b"][0]**2) saveanswer("c", c_val) elif eqdict["a"] == 0: a_val = math.sqrt(terms["c"][0]**2 - terms["b"][0]**2) saveanswer("a", a_val) elif eqdict["b"] == 0: b_val = math.sqrt(terms["c"][0]**2 - terms["a"][0]**2) saveanswer("b", b_val) main()
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

