[英]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.