La conjetura de Collatz con Python, algoritmo tradicional y recursivo

La conjetura de Collatz es uno de esos problemas matemáticos que son muy fáciles de enunciar pero que encierran una complejidad maravillosa.

No es la primera vez que me enfrento a este problema, es un clásico como ejercicio para cualquier lenguaje de programación, pero en esta ocasión usaré Python que es mi favorito últimamente.

Conjetura de Collatz

Pero primero lo primero ¿Qué es la conjetura de Collatz?

Empezamos con un número entero positivo.

Lo evaluamos, si el número es par entonces lo dividimos entre 2.

Si es impar, entonces se multiplica por 3 y se le suma 1.

Al resultado lo volvemos a evaluar y nuevamente aplicamos las operaciones correspondientes.

Al final, la secuencia de números termina con 4 , 2, 1

Pero esto no se ha demostrado que ocurra en todos los números enteros positivos, por eso es una conjetura.

Veamos un ejemplo muy simple:

numero = int(input("Teclee un número entero positivo : "))

if numero > 0:
    while numero != 1:
        if numero % 2:  
            numero = numero * 3 + 1
        else:
            numero //= 2
        print(numero)
else:
    print("El número que tecleo no es válido")

Un detalle curioso es como se evalúa si un número es par o impar.

numero % 2

Como pueden ver, se utiliza el operador módulo % que regresa el residuo de dividir el número entre 2.

Si el residuo es cero, entonces es par, si es uno entonces es impar.

True es igual a 1, False es igual a 0.

En el if de una forma prácticamente directa evaluamos si es par o impar.

Ahora veamos el resultado:

Teclee un número entero positivo : 11
34
17
52
26
13
40
20
10
5
16
8
4
2
1

La ejecución del programa se detiene cuando el valor de numero llega a 1.

Ahora en modo recursivo.

La recursión es una forma muy interesante de atacar un problema. Porque para llegar a la solución se llama nuevamente a la misma función.

Si tiene curiosidad haga una pausa y declare una función que haga las operaciones y podrá entender el ejercicio mental que es declarar una función recursiva.

El peligro es la condición de salida, porque si no se cumple, el programa puede entrar en un bucle infinito y no queremos eso.

numero = int(input("Teclee un número entero positivo : "))


def collatz(numero):
    print(numero)
    while numero != 1:
        if numero % 2:
            return collatz(numero * 3 + 1)
        else:
            return collatz(numero // 2)


if numero > 0:
    collatz(numero)
else:
    print("El número que tecleo no es válido")

Todavía tengo sentimientos encontrados sobre la ubicación de la instrucción print(numero) , si son observadores notarán la diferencia.

Teclee un número entero positivo : 11
11
34
17
52
26
13
40
20
10
5
16
8
4
2
1
 

Pero para lo único que la necesito es para “ver” el comportamiento de la variable numero durante la ejecución del programa.

Bonus track

¿Ahora que sigue? esto lo voy a hacer como ejercicio personal. Voy a poner todos los resultados intermedios en una variable que sea una lista para mostrarla al final. Y probablemente haré un test que comprobará los resultados.

El tema de la Conjetura de Collatz es fascinante, pero no soy un divulgador así que si quieren saber más del tema les recomiendo este video.

Sientanse libres de comentar el código, de esta forma se exploran nuevos enfoques que uno no conoce.

¡Saludos y hasta el próximo código!

¡Me encantaría saber que opinas!

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Salir de la versión móvil