while 循环不会在它应该中断的时候中断

While loop doesn't break when it should

我刚刚为 运行 Collat​​z 算法编写了一个 python 小程序,我认为 while 循环没有在应该中断的时候中断。我正在 运行 使用 VSCode 1.44.2 和 Python 3.7.5 64 位

def collatz(n):
    while n != 1.0:
        if n%2 == 0:
            n = n/2
        else:
            n = 3*n+1
        print(n)
        collatz(n)

collatz(3)

这是完整的输出

10
5.0
16.0
8.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
8.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
16.0
8.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
8.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
5.0
16.0
8.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
8.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
16.0
8.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
8.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0
4.0
2.0
1.0
1.0
2.0
1.0
1.0

程序到此结束,没有报错。当我单步执行程序时,当 n=1.0 时我看到一条消息“(return) collat​​z: None”,下一个调试器步骤再次进入 while 循环的开头。为什么程序不在此时结束?既然 n=1 时它没有结束,为什么它最终会结束而不是永远 运行?

你的循环似乎只在 n 达到 1 后才重复,因为你的函数递归调用自身,在我标记如下的行中:

def collatz(n):
    while n != 1.0:
        if n%2 == 0:
            n = n/2
        else:
            n = 3*n+1
        print(n)
        # recursive call here
        collatz(n)

因为你的函数递归调用自身,然后当 n 达到 1 时 while 循环确实终止,但这只意味着当前的递归调用 returns 然后是它下面的递归调用堆栈恢复,进行更多打印。

要解决您的问题,您应该只使用 while 循环或递归,而不是两者都使用。