过程控制问题

时间:2017-06-22 17:35:05

标签: python process-control

为什么第一次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()

1 个答案:

答案 0 :(得分:1)

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

  • 一次进入while collatz() != 1:,其中测试返回值。如果此时返回1,则退出循环。
  • 第二次进入循环体内。这次,返回值没有经过测试,因此即使它是1,您也只需返回while行。

因此,当您输入4时,输出为:

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

你也可以写下你的循环:

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