过程控制问题



为什么循环在第一次返回 1 时collatz()没有结束?

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()

在第一种方法中,在每个循环中调用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

最新更新