while循环中的递归函数更改变量[python]

乌米尔·拉菲克(Umair Rafique)

我有一个学生给我以下代码:

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行时inpjust的值更改为'yes'。在执行该行之前inp,根据调试器,的值仍然是用户输入的值。为什么呢?

现在我在这里查找了它,但是找不到任何解释,尽管我找到了一种解决方法,可以通过addtwo()在while循环的主体中的to调用之前添加一个return来解决(我在这里找到:递归地调用一个函数)用户输入),但不明白为什么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

亚瑟·塔卡(Arthur Tacca)

调用递归函数的工作方式有点像您已在其中复制并粘贴了内部函数。复制/粘贴与真实递归之间存在一些差异:

  • 每个函数都有自己的变量集
  • 当您将一个函数复制并粘贴到其自身中时,该函数只能调用(复制一个)自身次数与粘贴次数一样多,而递归会自动变得非常复杂。(这就是递归的全部内容。)

尽管存在这些差异,但是如果您想理解递归调用,则复制和粘贴是考虑它的好方法。让我们尝试一下您的功能。以下代码与您编写的内容等效,只要您键入的次数不是太多,就可以:

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在对的嵌套调用中设置为“是”addtwo不会将外部设置为“是” imp,因为每个函数都有其自己的变量集。

现在,您还可以看到问题的根本原因:您不需要多个循环即可执行此操作。递归(带有if)或while循环足以启用条件的重复检查。通过同时拥有这两者,即使您解决了紧迫的问题,也使事情变得不必要地复杂。在这种情况下,while循环实际上是最简单的。input语句放在其中,并完全摆脱递归调用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章