【问题标题】:Process Control Issue过程控制问题
【发布时间】:2017-06-23 02:27:48
【问题描述】:

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

【问题讨论】:

    标签: python process-control


    【解决方案1】:

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

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

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

    • 4(您的输入)
    • 2(同时行)
    • 1(正文 - 所以循环不会结束)
    • 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
    

    【讨论】:

    • 感谢您的建议。
    猜你喜欢
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多