Una tarde, te topaste con un viejo cuaderno lleno de garabatos crípticos, como si alguien hubiera estado persiguiendo una idea de forma obsesiva. En una de sus páginas, destacaba una sola pregunta: ¿Puede todo número encontrar su camino hasta el 1? Estaba ligada a algo llamado la conjetura de Collatz, un rompecabezas que ha desconcertado a los pensadores durante décadas.
Las reglas eran engañosamente sencillas. Elige cualquier número entero positivo.
Después, repite estos pasos con el resultado, y continúa así indefinidamente.
Con curiosidad, elegiste el número 12 para probarlo y comenzaste el viaje:
12 ➜ 6 ➜ 3 ➜ 10 ➜ 5 ➜ 16 ➜ 8 ➜ 4 ➜ 2 ➜ 1
Contando desde el segundo número (6), hicieron falta 9 pasos para llegar a 1, y cada vez que se repetían las reglas, el número no dejaba de cambiar. Al principio, la secuencia parecía impredecible: subía, bajaba y saltaba de un lado para otro. Sin embargo, la conjetura afirma que, sea cual sea el número de partida, siempre acabaremos en 1.
Era fascinante, pero también desconcertante. ¿Por qué parece funcionar siempre? ¿Podría existir algún número en el que el proceso se rompa, entrando en un bucle infinito o escapando hacia el infinito? El cuaderno daba a entender que resolver esto podría revelar algo profundo, y que, con ello, la fama, la fortuna y un lugar en la historia esperan a quien sea capaz de desvelar sus secretos.
Dado un número entero positivo, devuelve el número de pasos que se necesitan para llegar a 1 según las reglas de la conjetura de Collatz.
A veces es necesario lanzar una excepción. Cuando lo hagas, deberías incluir siempre un mensaje de error significativo que indique cuál es el origen del error. Esto hace que tu código sea más legible y ayuda mucho a la hora de depurar. En las situaciones en las que sabes que el origen del error será de un tipo concreto, puedes optar por lanzar uno de los tipos de error integrados, pero aun así deberías incluir un mensaje significativo.
La conjetura de Collatz solo se ocupa de los números enteros estrictamente positivos, así que este ejercicio espera que uses la instrucción raise y que «lances» un ValueError en tu solución si el valor dado es cero o un número entero negativo. Las pruebas solo pasarán si lanzas la exception con raise y además incluyes un mensaje con ella.
Para lanzar un ValueError con un mensaje, escribe el mensaje como argumento del tipo exception:
# example when argument is zero or a negative integer
raise ValueError("Only positive integers are allowed")
Regístrate en Exercism para aprender y dominar Python con 17 conceptos146 ejercicios y mentoría humana real, todo gratis.