貌似简单的递归函数陷入了无限循环。

6
我已经写了以下代码:
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版本。

3
因为您从未更改过x,所以while x <= y始终为真。 - kindall
2
无限递归,还是无限循环? - OneCricketeer
3
标题很出色。当然,板球做到了这一点。 - piokuc
1
输出结果应该是什么? - Scott Hunter
1
注意,在这种情况下,递归是您的循环结构,因此您可能不需要使用while循环。 - juanpa.arrivillaga
显示剩余3条评论
4个回答

4
incr_num(x + 1, y)会一直被调用,直到x == y,然后递归结束,返回先前执行的地方,其中x=9,所以x仍然具有传递的值,并且x <= y不为False。因此,递归再次发生并打印10。
在那个递归调用之后,至少需要x+=1
我不会简单地在递归中调用while循环 ;) 如果这是您结束递归的基本情况,您需要if x<=y

4

如果您的循环永远执行,那么它必须意味着条件x <= y始终为True。请考虑以下内容:

while x <= y:
    print x

这是你的代码的简化版本,但本质上这就是你所做的。

尝试使用以下方式:

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

这将打印出数字110


1
我不建议删除while循环,而是在调用incr_num之前增加x - aquaman

4
正确的版本应该是:
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(11,10) 立即返回。此后,incr_num(10,10) 继续执行。它不会跳出 while 循环并继续下一次迭代,打印 10 并再次调用 incr_num(11,10)。如你所见,这个循环没有结束。

由于 OP 没有说明预期结果,你怎么知道这是正确的版本? - Scott Hunter
@ScottHunter 我觉得问题就在于要知道程序为什么没有终止。 - aquaman
有很多方法可以使程序终止;但其中正确的并不多。 - Scott Hunter
1
我的假设是OP想要递归打印范围为[x,y]的整数。 - TimD1
我看到 OP 更新了问题 - 他希望它打印数字1到10。 - codeforester

3

你的条件应该是一个if条件,而不是while循环,因为你在while循环内没有改变x的值,每次条件都成立并进行递归调用。

这是一个已经纠正过的版本:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接