Problema de control de proceso

¿Por qué el bucle no termina la primera vez que collatz() devuelve 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() 

En su primer método, llama a collatz() dos veces en cada bucle:

  • una vez en while collatz() != 1: donde se prueba el valor de retorno. Si devuelve 1 en este punto, saldrá del bucle.
  • una segunda vez dentro del cuerpo del bucle. Esta vez, el valor de retorno no se prueba, por lo que incluso si es 1, simplemente regresará a la línea while .

Entonces, cuando ingresas 4, tu salida es:

  • 4 (su entrada)
  • 2 (línea recta)
  • 1 (cuerpo – para que el bucle no termine)
  • 4 (línea recta)
  • 2 (cuerpo)
  • 1 (mientras que la línea – ahora el bucle termina)

También podrías escribir tu bucle como:

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

Un consejo:

  • Evita usar variables globales, rápidamente se vuelven malvadas.
  • Preocupaciones separadas: por ejemplo, deje que su función collatz() tome un número como parámetro y devuelva el siguiente valor. Deje la impresión al rest del código.
  • trata de no repetirte.

Podrías modificarlo así, por ejemplo:

 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