簡體   English   中英

while循環中的遞歸函數更改變量[python]

[英]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()

穿過

  • add_two被稱為
  • 用戶輸入一個數字
  • 詢問他們是否要繼續
  • 他們輸入“是”
  • 而imp ==“ yes”現在將始終為true
  • 它調用add_two
    • 他們輸入一個數字
    • 他們輸入“否”
    • 循環不運行,因此返回到add_two的第一個調用
  • 回到while循環中。 它仍然計算為true,因此繼續調用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設置為“是”不會將inp1imp0設置為是。 或在原代碼,設置inp嵌套調用為“yes” addtwo不設置外imp為yes,因為每個功能都有它自己的一套變量。

現在,您還可以看到問題的根本原因:您不需要多個循環即可執行此操作。 遞歸(帶有if )或while循環足以啟用條件的重復檢查。 通過同時擁有兩者,即使您解決了緊迫的問題,也使事情變得不必要地復雜。 在這種情況下, while循環實際上是最簡單的。 input語句放在其中,並完全消除遞歸調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM