1

为什么循环第一次没有结束collatz()返回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()
4

1 回答 1

1

在您的第一种方法中,您在每个循环中调用collatz()两次:

  • 一旦进入while collatz() != 1:,返回值就会被测试。如果此时它返回 1,您将退出循环。
  • 第二次在循环体内。这一次,返回值没有被测试,所以即使它是 1,你也只是回到while那一行。

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

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

你也可以像这样写你的循环:

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

一点建议:

  • 避免使用全局变量,它们很快就会变得邪恶
  • 单独的关注点:例如,让你的collatz()函数将一个数字作为参数,并返回下一个值。将打印留给代码的其余部分。
  • 尽量不要重复自己。

您可以像这样修改它,例如:

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
于 2017-06-22T18:25:10.600 回答