Secuencia Collatz


Descripción

Escribe una función llamada collatz que tome un parámetro llamada number. Si number es par, entonces collatz debe imprimir el resultado de number // 2 y devolver este valor. Si number es impar, entonces collatz debe imprimir y devolver el resultado de 3 * number + 1.

Luego escribe un programa que permita que el usuario ingrese un entero, continúa llamando a la función collatz en ese número hasta que el valor devuelto sea 1. Sorprendentemente, tarde o temprano esta secuencia llega a uno para cualquier entero. Ni siquiera los matemáticos están seguros del porqué. Tu programa explora lo que se conoce como la secuencia Collatz, algunas veces conocido como el problema imposible de matemáticas más simple.

Recuerda convertir el valor de retorno de la función input a un entero con la función int: de otra forma, será un valor tipo string.

Consejo: Un número entero es par si el residuo de su división entre 2 es cero (number % 2 == 0) y es impar si number % 2 == 1.

Ejemplo de Ejecución:

Ingresa un número:
3
10
5
16
8
4
2
1

Validación de datos

Agrega las instrucciones try and except al código anterior, para detectar si el usuario ingresa un valor que no es un número entero. Normalmente, la función int lanzará un error tipo ValueError si se le pasa un valor no entero, por ejemplo int('puppy'). Dentro de la instrucción except, imprimee un mensaje al usuario diciendo que debe ingresar un entero.

Solución

Mostrar solución
def collatz(number):
  if number % 2 == 0:
    return number // 2
  else:
    return 3 * number + 1

try:
  user_number = int(input('Ingresa un número entero: '))
except:
  print('Debes ingresar un número entero')
  exit()

while user_number != 1:
  print(user_number)
  user_number = collatz(user_number)
print(user_number)

Probar solución en Google Colab

Fuente del ejercicio: https://automatetheboringstuff.com/2e/chapter3/#calibre_link-150