【问题标题】:While loop doesn't break when it shouldWhile 循环在应该中断时不会中断
【发布时间】:2020-04-28 15:20:57
【问题描述】:

我只是在编写一个小 Python 程序来运行 Collat​​z 算法,我认为 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)

这是完整的输出

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 就没有结束,那为什么最终会结束,也不会一直运行呢?

【问题讨论】:

  • 修复缩进。当您只需要其中之一时,似乎您正在混合循环和递归。
  • 是的,你是对的 :) 在 while 循环中删除函数调用会给我正确的结果。非常感谢!

标签: python python-3.x collatz


【解决方案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 循环确实会终止,但这仅意味着当前递归调用返回,然后堆栈中它下面的调用恢复,进行更多打印。

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

【讨论】:

    猜你喜欢
    • 2021-01-30
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 2013-06-04
    • 1970-01-01
    相关资源
    最近更新 更多