过程控制问题

Process Control Issue

为什么第一次循环不结束collatz() returns 1?

def collatz():
    global number
    if number % 2 == 0:
        number = number // 2
        print(number)
        return number
    else:
        number = 3 * number + 1
        print(number)
        return number

try:
    number = int(input('Please enter an integer except zero.\n'))
except ValueError:
    print("ValueError: invalid value.")
    number = int(input('You must enter an integer except zero.\n'))


while collatz() != 1:   # if input(4), the output will be: 4 2 1 4 2 1 
    collatz()


# another way, which works:
while number != 1:  --> # also input(4), the output will be: 4 2 1
    collatz()

在你的第一个方法中,你在每个循环中调用了两次 collatz()

  • 一次在 while collatz() != 1: 中,其中测试 return 值。如果此时returns 1,则退出循环
  • 第二次在循环体内。这次,return 值没有被测试,所以即使它是 1,你也只是回到 while 行。

所以,当你输入 4 时,你的输出是:

  • 4(您的输入)
  • 2(同时行)
  • 1(正文 - 所以循环不会结束)
  • 4(同时行)
  • 2(正文)
  • 1(while 行 - 现在循环结束)

您也可以像这样编写循环:

while collatz() != 1:
    pass  # do nothing

一点建议:

  • 避免使用全局变量,它们很快就会变坏
  • 分离关注点:例如,让您的 collatz() 函数将一个数字作为参数,return 下一个值。将打印留给其余代码。
  • 尽量不要重复自己。

您可以这样修改,例如:

def collatz(n):
    if n % 2 == 0:
        n = n // 2
    else:
        n = 3 * number + 1
    return n

try:
    number = int(input('Please enter an integer except zero.\n'))
except ValueError:
    print("ValueError: invalid value.")
    number = int(input('You must enter an integer except zero.\n'))


while True:  # infinite loop
    number = collatz(number)
    print(number)
    if number == 1:
        # we break out of the loop
        break