看似简单的递归函数以无限循环结束

时间:2017-12-02 00:58:25

标签: python recursion

我写了以下代码:

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。

4 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分: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

答案 2 :(得分: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(10,10)继续。它不会突破while循环并继续下一次迭代,打印10并再次调用incr_num(11,10)。如您所见,这个循环并没有结束。

答案 3 :(得分:3)

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

这是它的更正版本

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