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

2024-09-27 07:23:12 发布

您现在位置: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()

在第一次迭代之后,如果用户输入了“yes”以外的任何内容,while循环的主体就不会如预期的那样执行。但是,如果我们输入'yes',它就会执行(正如预期的那样)并提示“enteranynumber”,但是在第二次迭代中,即使用户在“Doyouwillenteragain”中输入了“yes”之外的任何内容,while循环的主体仍然会执行。现在我在上面运行了调试器,发现在执行第5行时,inp的值只会变为'yes'。在执行行之前,根据调试器,inp的值仍然是用户输入的值。为什么会这样?在

现在我在这里查找它,但是找不到任何解释,尽管我找到了一种方法来解决这个问题,在while循环体中的addtwo()调用之前添加了一个return(我在这里找到了:Calling a function recursively for user input),但是我不明白为什么inp的值在本地堆栈中发生了变化,以及return语句是如何修复它的?在

工作代码如下:

^{pr2}$

而且,让我更困惑的是,如果我们使用if语句而不是while,代码就可以正常工作。在


Tags: 代码用户add内容inputreturn语句调试器
2条回答

调用递归函数有点像复制并粘贴了内部函数。复制/粘贴和真正的递归之间有一些区别:

  • 每个函数都有自己的一组变量
  • 当你自动调用一个复制函数时,你可以自动调用一个函数。(这就是递归的全部要点。)

尽管存在这些差异,但是如果您正在努力理解递归调用,那么复制和粘贴是一种很好的方法。我们来试试你的功能吧。以下代码与您编写的代码相同,只要您不要键入“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!")

如果我们把这些嵌入到一个函数中,也许会更清楚。我们必须重命名变量,这样它们就不会互相覆盖了。在

^{pr2}$

现在您可以看到问题的直接原因:将inp2设置为“yes”不会将inp1或{}设置为yes。或者在原始代码中,在对addtwo的嵌套调用中将inp设置为“yes”,并没有将外部的{}设置为yes,因为每个函数都有自己的一组变量。在

现在您还可以看到问题的根本原因:您不需要多个循环来执行此操作。递归(带有if)或while循环都足以重复检查条件。如果两者兼而有之,即使你解决了眼前的问题,也会让事情变得不必要的复杂。在本例中,while循环实际上是最简单的;将input语句放在其中,然后完全去掉递归调用。在

摘要

这是因为一旦输入yes一次,该函数将永远循环,而不管下一个递归调用做什么。在

您可以通过更改以下内容来修复代码:

while inp == "yes":
    add_two()

^{pr2}$

走查

  • 叫加法2
  • 用户输入一个数字
  • 他们被问到是否愿意继续
  • 他们输入“是”
  • 而imp==“是”现在将始终为真
  • 它叫加二
    • 他们输入一个数字
    • 他们输入“不”
    • 循环不运行,因此返回add_2的第一个调用
  • 回到while循环。它的计算结果仍然为true,因此继续调用add\u two

返回语句

默认情况下,python中不返回任何值的函数实际上不返回任何值。这意味着您调用add_two,如果用户在提示时没有输入“yes”,它将返回,这将强制第一个调用也返回。在

相关问题 更多 >

    热门问题