过程控制问题

2024-04-27 01:41:29 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么循环不在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()

Tags: theannumberinputreturnifintegerint
1条回答
网友
1楼 · 发布于 2024-04-27 01:41:29

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

  • while collatz() != 1:中测试一次返回值。如果此时返回1,则退出循环
  • 第二次在环体内。这一次,不会测试返回值,因此即使返回值为1,也只需返回while

因此,当您输入4时,您的输出是:

  • 4(你的意见)
  • 2(边线)
  • 1(主体-因此循环不会结束)
  • 4(边线)
  • 2(车身)
  • 1(while line-现在循环结束)

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

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

相关问题 更多 >