为什么这个递归函数不能完成两次打印?

时间:2013-09-19 01:03:05

标签: python recursion

我仍在尝试理解递归以及我期望打印的代码和实际打印的内容是不同的。

所以这里的代码基于我在youtube上找到的一个简单例子,

def count(n):
    if n > 0:
        print "Count 1", ", ", n

        count(n - 1)

        print "Count 2", ", ", n
    else:
        print "Done"

count(1)

这就是它打印的内容,

计数1,1

完成

计数2,1

我的期望

计数1,1

完成

完成

我的理解(当然是错误的)是将调用count(1)(用于外部计数函数),因为1大于0将打印1,然后计数(1 - 1)(内部计数功能)将调用count(0)(外部计数功能),并且由于0不大于1,这将打印完成。然后我认为从count(1 - 1)返回(内部计数函数)也将返回Done,因为没有其他n值输入到内部count()中。我不知道怎么做了一次打印,1次打印两次???

7 个答案:

答案 0 :(得分:5)

让我们手动浏览这个函数,输入1

  • count(1)已调出(n1):
    • n > 0 true ,所以(if子句):
      • 打印 Count 1 , 1 (因为此处n 1
      • count(0)已调出(n0):
        • n > 0 false ,所以(else子句):
          • 打印 Done
      • 打印 Count 2 , 1 (因为此处n 1

如您所见,done仅打印一次。当你面对这种困境时,通常会非常有助于拿出铅笔和记事本并准确地找出手头发生的事情。

您还可以通过删除前两个打印语句来考虑函数的简化版本,因为它们不应影响打印"Done"的次数:

def count(n):
    if n > 0:
        count(n - 1)
    else:
        print "Done"

现在应该更加清楚"Done"只打印一次:

  • count(1)已调出(n1):
    • n > 0 true ,所以(if子句):
      • count(0)已调出(n0):
        • n > 0 false ,所以(else子句):
          • 打印 Done

答案 1 :(得分:1)

让我们对count函数进行简单的扩展,看看究竟发生了什么:

def count0:
    print "Done"

def count1:
    print "Count 1, 1"
    count0()
    print "Count 2, 1"

如您所见,count1(实际上任何count(n)对于n> 0)将永远不会打印"Done"。所以它只打印一次。

答案 2 :(得分:1)

您的脚本有两个声明

  1. count
  2. 的定义
  3. 使用参数1调用count
  4. 因此count被调用且n为1.由于n大于0,因此按顺序执行这三行

        print "Count 1", ", ", n    # ===> which prints Count 1, 1
    
        count(n - 1)                # ===> which prints Done
    
        print "Count 2", ", ", n    # ===> which prints Count 2, 1
    

    与所有递归函数一样,不要试图过度思考并追踪内部调用。只从顶层看脚本,让递归发挥其魔力。你的电话执行了三行。当然内线是递归调用,但在你弄清楚其他线路的作用之前不要担心。

    顺便说一下,每个递归调用都会在n上获得自己的副本,因此“外部值”不受影响。当然你可以编写具有副作用的递归代码,但你真的不想这样做。

答案 3 :(得分:0)

当呼叫count(n-1)返回时,它会继续运行以下行,在这种情况下,另一行使用计数2。

答案 4 :(得分:0)

因为else块中的打印“Done”仅发生在n <= 0时的计数调用中。在第一次调用n = 1时,此语句不会被执行,只会在第二次执行时执行,递归调用,当n为0时。

答案 5 :(得分:0)

打印出第一行Count 1,1

它调用将打印Done的方法,因为n现在为0,因此if条件失败。

然后它将回到调用方法的方法并转到下一行

是打印计数2,1,因为n没有改变它的值(如果你设置n = n-1,n将等于0)。

答案 6 :(得分:0)

我认为你出错的地方是count(n-1)的返回值没有任何反应。

第一次使用n = 1进行计数的调用打印“Count 1,1”,然后调用count(0)。在此调用中,n = 0,因此打印“完成”并返回。现在我们回到count(1),就在调用count(0)之后。然后我们只做下一个打印“Count 2,1”的语句,因为n仍然是1。 然后我们就完成了。