2

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

所以这是基于我在 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,然后 count(1 - 1) (内部计数函数)将调用count(0) (外部计数函数),由于 0 不大于 1,这将打印完成。然后我认为 count(1 - 1) (内部计数函数)的返回也会返回 Done ,因为没有其他 n 值输入到内部 count() 中。我不明白如何完成打印一次和 1 打印两次???

4

7 回答 7

7

让我们手动检查函数的输入1

  • count(1)称为(n1):
    • n > 0true,所以(if 子句):
      • 打印Count 1 , 1(因为n1这里)
      • count(0)称为(n0):
        • n > 0false,所以(else 子句):
          • 打印Done
      • 打印Count 2 , 1(因为n1这里)

如您所见,done仅打印一次。当您面临这种困境时,拿出旧铅笔和记事本并用手准确地追踪正在发生的事情通常会很有帮助。

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

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

现在应该更清楚了,"Done"只会打印一次:

  • count(1)称为(n1):
    • n > 0true,所以(if 子句):
      • count(0)称为(n0):
        • n > 0false,所以(else 子句):
          • 打印Done
于 2013-09-19T01:08:55.093 回答
2

让我们对 count 函数做一个简单的扩展,看看到底发生了什么:

def count0:
    print "Done"

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

如您所见,count1(对于 n > 0 来说,实际上是任何count(n))都不会 print "Done"。所以它只打印一次。

于 2013-09-19T01:08:33.820 回答
1

您的脚本有两个语句

  1. 的定义count
  2. count带有参数 1的调用。

socount被称为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

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

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

于 2013-09-19T01:10:17.513 回答
1

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

第一次调用 n=1 的 count 打印“Count 1,1”,然后调用 count(0)。在这个调用中 n=0 所以它打印“完成”并返回。现在我们回到 count(1),就在调用 count(0) 之后。然后我们只执行下一条打印“Count 2, 1”的语句,因为这里 n 仍然是 1。然后我们就完成了。

于 2013-09-19T01:16:48.340 回答
0

当调用count(n-1)返回时,它继续运行以下行,在这种情况下,另一个打印 Count 2。

于 2013-09-19T01:07:04.147 回答
0

因为 else 块中的 print "Done" 仅在 n <= 0 时发生在 count 调用中。在 n = 1 的第一次调用中,该语句将不会执行,它只会在第二次递归调用时执行,当n 为 0。

于 2013-09-19T01:08:18.970 回答
0

在它打印出第一行 Count 1, 1

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

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

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

于 2013-09-19T01:08:45.643 回答