Process Control Issue

2019-03-02 22:27发布

Why doesn't the loop end the first time 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()

1条回答
\"骚年 ilove
2楼-- · 2019-03-02 23:27

In your first method, you call collatz() twice in each loop:

  • once in while collatz() != 1:, where the return value gets tested. If it returns 1 at this point, you will exit the loop.
  • a second time inside the body of the loop. This time, the return value doesn't get tested, so even if it is 1, you'll just go back to the while line.

So, when you input 4, your output is:

  • 4 (your input)
  • 2 (while line)
  • 1 (body - so the loop won't end)
  • 4 (while line)
  • 2 (body)
  • 1 (while line - now the loop ends)

You could also write your loop like:

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

A bit of advice:

  • Avoid using global variables, they quickly become evil
  • Separate concerns: for example, let your collatz() function take a number as parameter, and return the next value. Leave the printing to the rest of the code.
  • try not to repeat yourself.

You could modify it like this, for example:

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
查看更多
登录 后发表回答