繁体   English   中英

While 循环在应该中断时不会中断

[英]While loop doesn't break when it should

我只是在编写一个小 python 程序来运行 Collatz 算法,我认为 while 循环在应该中断的时候并没有中断。 我用 VSCode 1.44.2 和 Python 3.7.5 64bit 运行这个

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)

这是完整的 output

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) collatz: None”,并且下一个调试器步骤再次进入 while 循环的开头。 为什么程序没有在这一点上结束? 既然 n=1 时它没有结束,为什么它最终会结束并且不会永远运行?

您的循环仅在n达到 1 后才出现重复,因为您的 function 递归调用自身,在我在下面标记的行上:

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)

因为您的 function 递归地调用自身,所以当n达到 1 时, while循环确实终止,但这仅意味着当前递归调用返回,然后堆栈上它下面的调用恢复,进行更多打印。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM