递归循环后函数未正确结束

时间:2021-03-07 21:10:32

标签: java loops while-loop return

我正在尝试构建游戏风险的复制猫。我有一个 while 循环,它表示在攻击未完成时执行某些操作。然后我要求用户输入“结束回合”以结束回合或“继续”以再次递归调用攻击函数。问题是在用户输入攻击几次然后“结束回合”之后,回合不会结束,而是从头开始或再次开始功能。我非常感谢专家的眼光来查看我的代码,看看我缺少什么,提前致谢。

response = requests.get(u,headers=h).json()
dp = pd.json_normalize(response,'Units')
response_list.append(dp)

export = pd.concat(response_list)
export.to_csv(r'C:\Users\username\Documents\Python Scripts\Test\Test2_'+str(now)+'.csv', index=False, sep=';',encoding='utf-8')

access_path = r"C:\Users\username\Documents\Python Scripts\Test\Test_db.accdb"
conn = pyodbc.connect("DRIVER={{Microsoft Access Driver (*.mdb, *.accdb)}};DBQ={};" \
                     .format(access_path))
strSQL = "SELECT * INTO projects2 FROM [text;HDR=Yes;FMT=sep(;);" + \
         "Database=C:\\Users\\username\\Documents\\Python Scripts\\Test].Testdata.csv;"  

cur = conn.cursor()
cur.execute(strSQL)
conn.commit()
conn.close() 

1 个答案:

答案 0 :(得分:0)

好的 - 正如目前所写 - 每次你在方法中调用attackOrSkip - 你最终在堆栈中低一级 - 有一组新的变量 -

   attackFinished, numUnitsAttackWith, defenceArmiesNumber

当您离开递归(即通过返回)时,您最终会得到与进入递归调用之前一样的简单变量 - 请记住 Java 是按值调用(即使您可以传递对对象的引用,您也会得到一个值(调用时变量引用的当前值......并且将引用更改为指向不同的对象不会更改调用者引用)。

所以,无需查看您是否执行了正确的算法-我猜想,如果您使方法返回类型为布尔值并返回状态而不是什么,您可以更新attackFinished,可能会发生正确的事情..

例如改变一切

return;

return attackFinished;

并更改您打电话的所有地点

attackOrSkip(....)

根据方法返回的内容设置攻击完成

attackFinished = attackOrSkip(....)

OR - 你可以传入一个额外的参数 - attackFinished - 在一个 Holder (an example of the concept) 对象中 - 同样引用不能改变,但你可以去attackFinished.value = true(然后它会是相同的当您退出递归时,将完全退出堆栈)。