【问题标题】:Seemingly straightforward recursive function ends in infinite loop看似简单的递归函数以无限循环结束
【发布时间】:2017-12-02 13:34:39
【问题描述】:

我写了以下代码:

def incr_num(x, y):
    while x <= y:
        print x
        incr_num(x+1, y)

当我将其调用为

incr_num(1, 10)

它进入一个无限循环并给出以下输出:

1
2
3
4
5
6
7
8
9
10
10
10
10
10
10
10

(number 10 keeps repeating)

我期待它打印数字 1-10。我无法理解为什么它没有。谁能告诉我为什么会这样。

我正在使用python2.7。

【问题讨论】:

  • 因为你永远不会改变x,所以while x &lt;= y总是正确的。
  • 无限递归,还是无限while循环?
  • 用 if 代替 while
  • 出色的标题。板球当然做到了。
  • 应该输出是什么?

标签: python recursion


【解决方案1】:

正确的版本是:

def incr_num(x, y):
    if x <= y:
        print x
        incr_num(x+1, y)

请注意,对于每个递归函数调用,x 最多打印一次。

更新: 您的函数不起作用的原因是 incr_num(10,10) 打印 10 然后调用 incr_num(11,10),它立即返回。在此之后,incr_num(10,10) 继续。它不会跳出while 循环并继续下一次迭代,打印10 并再次调用incr_num(11,10)。如您所见,这个循环并没有结束。

【讨论】:

  • 你怎么知道这是正确的版本,因为 OP 没有说明预期的结果应该是什么?
  • @ScottHunter 这个问题在我看来只是想知道为什么程序没有终止。
  • 有很多方法可以让程序终止;没有多少是正确的。
  • 我的假设是 OP 想要递归打印 [x,y] 范围内的整数。
  • 我看到 OP 更新了问题 - 他确实希望它打印数字 1 到 10。
【解决方案2】:

如果你的循环永远执行,它一定意味着条件x &lt;= y总是True。考虑一下:

while x <= y:
    print x

这是您代码的简化版本,但本质上就是您正在做的事情。

试试:

def incr_num(x, y):
    if x <= y:
        print x
        incr_num(x+1, y)

这会打印从110 的数字。

【讨论】:

  • 我不建议删除 while 循环,而是在调用 incr_num 之前增加 x
【解决方案3】:

incr_num(x+1, y) 一直被调用,直到x == y,然后递归结束,然后你返回到x=9 的上一个执行,所以x 仍然具有它传递的值,并且x &lt;= y 不是 False .因此递归再次发生并打印 10

在递归调用之后,您至少需要一个 x+=1

我不会直接在递归中调用 while 循环;)如果这是您结束递归的基本情况,您需要 if x&lt;=y

【讨论】:

    【解决方案4】:

    您的条件应该是 if 条件而不是 while 循环,因为您不会在 while 循环中更改 x 的值,并且每次条件变为 true 并进行递归调用。

    这是一个修正版

    def incr_num(x, y):
            if x <= y:
                print x
                incr_num(x+1, y)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 2015-01-29
      • 1970-01-01
      • 2021-12-06
      相关资源
      最近更新 更多