首页 > 解决方案 > 我的代码在不应该循环的时候不断循环

问题描述

我正在创建一个 python 程序,给定三角形的任何角度/边将解决所有其他适用的边。为此,我有一个长度为 a、b、c 和边为 aa、ba、ca 的列表字典。字典的结构是这样的,列表中的第一项是键的值,第二项是 0 或 1,这取决于它是否被回答。

该程序获取列表的第二个值并将其放入我称为的另一个字典eqdict中。对于 eqdict,该值为 1 或 0,具体取决于该值是否已知。有了这个我们可以做勾股定理,所以如果 a+b+c=2,那么我们知道 1 个值丢失了,所以它启动一个函数来查找丢失的边。在此函数之后,答案与saveanswer函数一起保存,并再次调用方程查找器函数。但是,当程序通过方程式查找器返回时,eqdict它找到的任何字符都没有设置为 0,因此它具有连续循环。

import math

def main():
    #creating terms in strings because I cant find an answer on how
    #to make floats with a non zero no value

    global terms
    terms={"a":[0,0],"b":[0,0],"c":[0,0],"aa":[0,0],"ba":[0,0],"ca":[0,0]}

    selectterms()

def selectterms():
    """takes user input for terms"""

    doneterm=False
        
    while not doneterm:
        print("Please select the variable and then write it's value")
        print("When done, please press enter with command prompt empty")
        term1=input("Variable: ")
        
        
        #to start program need to enter no command
        if term1=="":
            doneterm=True
            appender()
            
        #to end program after its finished
        if doneterm ==False:
            term2=float(input("Number: "))
            terms[term1]=[term2]
            terms[term1].append(1)
    return

def addtoeqdict(term):
  eqdict[term]=1
  return

def saveanswer(term,num):
  """saves answer to answers dict, makes second term 1 and sends back the number"""
  answers={}
  print("saveanswer")
  answers[term]=num
  #print("answers",answers)
  terms[term][1]=1
  terms[term][0]=num
  eqdict[term]=1
  print(answers)
  print(eqdict)
  eqfinder(**eqdict)

def appender():
    """Append a 0 on to terms that have only 1 item in list"""

    global eqdict

    eqdict={}

    keys=terms.keys()

    for i in keys:
      i = str(i)
      eqdict[i]=int(terms[i][1])

    eqfinder(**eqdict)
    return

def eqfinder(a,b,c,aa,ba,ca):
    """runs through given terms to find any possible equations.
    looks for possible equations by adding appended values"""

    nomoreterms=False

    while nomoreterms == False:
      print(terms)
      if terms["aa"][0]!=0 or terms["ba"][0]!=0 or terms["ca"][0]!=0:
        if terms["aa"][0]<0 or terms["ba"][0]<0 or terms["ca"][0]<0:
          posangles(terms["aa"][0],terms["ba"][0],terms["ca"][0])
      print(a,b,c,aa,ba,ca)
      if c+a+b==2:
        cab(terms["c"][0],terms["a"][0],terms["b"][0])

      else:
        nomoreterms=True

def posangles(aa,ba,ca):
  print("Posangles")
  if aa<0:
    aa=aa*(-1)
    saveanswer("aa",aa)
  elif ba<0:
    ba=ba*(-1)
    saveanswer("ba",ba)
  elif ca<0:
    ca=ca*(-1)
    saveanswer("ca",ca)

def cab(c,a,b):
  print("cab")
  if c==0:
    c=math.sqrt(a**2+b**2)
    saveanswer("c",c)
  elif a==0:
    a=math.sqrt(c**2-b**2)
    saveanswer("a", a)
  elif b==0:
    b=math.sqrt(c**2-a**2)
    saveanswer("b",b)

main()

标签: python

解决方案


所以问题是你的 eqfinder 功能。你传入a, b, c使用 cab 查找缺失值,并保存答案。然后它返回到 eqfinder 并检查if a + b + c == 2它是做什么的,因为您从未更新过a, b, c变量。您可以进行许多修复以使此中断脱离 for 循环。这是一个(用>>>标记的添加行):

def eqfinder(a,b,c,aa,ba,ca):
    """runs through given terms to find any possible equations.
    looks for possible equations by adding appended values"""

    nomoreterms=False

    while nomoreterms == False:
      print(terms)
      if terms["aa"][0]!=0 or terms["ba"][0]!=0 or terms["ca"][0]!=0:
        if terms["aa"][0]<0 or terms["ba"][0]<0 or terms["ca"][0]<0:
          posangles(terms["aa"][0],terms["ba"][0],terms["ca"][0])
      print(a,b,c,aa,ba,ca)
      if c+a+b==2:
        cab(terms["c"][0],terms["a"][0],terms["b"][0])
        >>> c, a, b = terms["c"][1],terms["a"][1],terms["b"][1]

      else:
        nomoreterms=True

推荐阅读