[英]Recursive function in while loop changing variable [python]
我有一個學生給我以下代碼:
def addtwo():
numb=input("enter any number")
add=int(numb)+2
print(add)
inp = input("do you wish to enter again")
while inp=="yes":
addtwo()
在第一次迭代之后,如果用戶輸入“是”以外的任何內容,則while循環的主體將不會按預期執行。 但是,如果我們輸入“是”,它將執行(再次如預期那樣)並提示“輸入任何數字”,但是在第二次迭代中,即使用戶在“您是否希望再次輸入”上輸入了除“是”之外的任何內容。 ,while循環的主體仍會執行。 現在我在上面運行調試器,發現執行第5行時inp
的值只是變為'yes'
。在執行該行之前,根據調試器, inp
的值仍然是用戶輸入的值。 為什么會這樣?
現在我在這里查找了它,但是找不到任何解釋,盡管我找到了一種解決方法,可以通過在while循環主體中對addtwo()
的調用之前添加一個返回值來addtwo()
(我在這里找到了: 調用a遞歸函數供用戶輸入 ),但無法理解為什么inp
的值只是在本地堆棧中更改,以及return
語句如何解決它?
這是工作代碼:
def addtwo():
numb=input("enter any number")
add=int(numb)+2
print(add)
inp = input("do you wish to enter again")
while inp=="yes":
return addtwo()
而且,令我感到困惑的是,如果我們使用if
語句而不是while
,那么代碼可以很好地工作。
摘要
這是因為一旦輸入一次,該函數將永遠循環,無論下一個遞歸調用做什么。
您可以通過更改以下內容來修復代碼:
while inp == "yes":
add_two()
至
if inp == "yes":
add_two()
穿過
退貨聲明
在python中,默認情況下,不返回任何內容的函數實際上返回None。 這意味着您將調用add_two,如果用戶在提示時未輸入“ yes”,它將返回,這將迫使第一個調用也返回。
調用遞歸函數的工作方式有點像您已在其中復制並粘貼了內部函數。 復制/粘貼與真實遞歸之間存在一些差異:
盡管存在這些差異,但是如果您難以理解遞歸調用,則復制和粘貼是考慮它的好方法。 讓我們嘗試一下您的功能。 以下代碼與您編寫的內容等效,只要您鍵入的次數不是太多,就可以:
def addtwo0():
numb=input("enter any number")
add=int(numb)+2
print(add)
inp = input("do you wish to enter again")
while inp=="yes":
return addtwo1()
def addtwo1():
numb=input("enter any number")
add=int(numb)+2
print(add)
inp = input("do you wish to enter again")
while inp=="yes":
return addtwo2()
def addtwo2():
numb=input("enter any number")
add=int(numb)+2
print(add)
inp = input("do you wish to enter again")
while inp=="yes":
raise Exception("tried to recurse too deeply!")
如果將這些內聯函數放在一個函數中,也許會更加清晰。 我們必須重命名變量,以免它們彼此覆蓋。
def addtwo():
numb0=input("enter any number")
add0=int(numb0)+2
print(add0)
inp0 = input("do you wish to enter again")
while inp0=="yes":
numb1=input("enter any number")
add1=int(numb1)+2
print(add1)
inp1 = input("do you wish to enter again")
while inp1=="yes":
numb2=input("enter any number")
add2=int(numb2)+2
print(add2)
inp2 = input("do you wish to enter again")
while inp2=="yes":
raise Exception("tried to recurse too deeply!")
現在,您可以看到問題的直接原因:將inp2
設置為“是”不會將inp1
或imp0
設置為是。 或在原代碼,設置inp
嵌套調用為“yes” addtwo
不設置外imp
為yes,因為每個功能都有它自己的一套變量。
現在,您還可以看到問題的根本原因:您不需要多個循環即可執行此操作。 遞歸(帶有if
)或while
循環足以啟用條件的重復檢查。 通過同時擁有兩者,即使您解決了緊迫的問題,也使事情變得不必要地復雜。 在這種情況下, while
循環實際上是最簡單的。 將input
語句放在其中,並完全消除遞歸調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.