You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python三角形边角求解程序非预期无限循环问题排查求助

问题根因

死循环问题核心是两点:

  • eqfinder函数的形参a、b、c是调用时从eqdict解包传入的局部静态副本,后续你更新全局eqdict的值时,已经进入eqfinder函数的这几个局部参数不会同步更新,所以c+a+b==2的判断会一直成立,不断触发求解逻辑。
  • 求解后递归调用eqfinder的逻辑和eqfinder内部的while循环叠加,既会导致调用栈不断加深,也不会刷新上层eqfinder的局部参数值,循环永远无法退出。

修复方案

  1. 移除eqfinder的所有入参,判断已知参数数量时直接读取全局eqdict的最新值,避免静态副本带来的状态不一致问题。
  2. 去掉递归调用eqfinder的逻辑,仅保留eqfinder内部的循环,每次循环都重新读取最新的参数状态,直到没有可求解的项就退出。
  3. 求解函数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 10:06:03