Secuencia de Collatz en Python

Jay Shaw 10 octubre 2023
  1. Lógica de programación detrás de la secuencia de Collatz
  2. Secuencia de Collatz en Python usando if-else
  3. Secuencia de Collatz en Python usando bucle while y manejo de excepciones
  4. Secuencia de Collatz en Python usando recursividad
  5. Secuencia de Collatz en Python usando el bucle while
  6. Conclusión
Secuencia de Collatz en Python

La secuencia de Collatz es una secuencia matemática de números que termina en 1. Se dice que cuando un número se somete a un conjunto específico de operaciones, el último dígito que queda debe ser 1.

Este artículo explicará cómo escribir programas que encuentren la secuencia collatz en Python en cualquier número dado.

Lógica de programación detrás de la secuencia de Collatz

Se deben seguir cuatro operaciones para encontrar la secuencia collatz de un número dado en Python.

  1. Comprobar si el número es par o impar.
  2. Para un número par, el programa divide el número n por 2 y lo imprime.
  3. Para un número impar, el programa multiplica n por 3, luego le suma 1 y lo imprime.
  4. El programa comprueba si el número n se ha reducido a 1; si no, se ejecuta de nuevo.

Para un número 5 dado, la secuencia collatz será - 16, 8, 4, 2, 1.

Las siguientes secciones explicarán cuatro formas de crear un programa que muestre secuencias collatz en Python.

Secuencia de Collatz en Python usando if-else

El siguiente programa muestra una representación simple para encontrar una secuencia collatz en Python. Se crea un método collatz_seq con un único parámetro numb.

La lógica utilizada en este programa utiliza una instrucción if-else dentro de un bucle while. Al principio, el programa ejecuta un bucle while dentro del método collatz_seq para comprobar si el valor dentro de la variable numb es 1 o no.

Si la variable numb no es 1, entonces el programa ejecuta una segunda verificación para encontrar si el número dado es par o impar usando una declaración if-else. Dentro de la sentencia if, el programa comprueba si el número dividido por 2 deja algún resto.

if numb % 2 == 0:
    pass

Si el número es par, el programa lo divide por 2 y lo imprime. En caso de que el número sea impar, el programa cambia a la sentencia elif, donde numb % 2 == 1 es true.

La variable numb se multiplica por 3 y se le suma 1. Por último, se imprime el número.

if numb % 2 == 0:
    pass
elif numb % 2 == 1:
    numb = (numb * 3) + 1
    print(numb)

Esta secuencia de bucles continúa ejecutando las operaciones de verificación, actualización e impresión del número hasta que el valor de numb se reduce a 1 y cuando el valor de numb se encuentra como 1, el while salidas de bucle.

Por último, se llama al método collatz_seq y se pasa 5 como valor del argumento.

def collatz_seq(numb):
    while numb != 1:
        if numb % 2 == 0:
            numb = numb // 2
            print(numb)

        elif numb % 2 == 1:
            numb = (numb * 3) + 1
            print(numb)


collatz_seq(5)

Muestra la secuencia collatz en Python para una entrada = 5 es:

16
8
4
2
1

Secuencia de Collatz en Python usando bucle while y manejo de excepciones

El ejemplo anterior demostró un programa que imprime la secuencia collatz de un número determinado en Python. Pero el programa tiene muchos cabos sueltos que pueden provocar bloqueos.

Por ejemplo, el programa falla si se proporciona una cadena para el valor de adormecer. De manera similar, el programa falla si se proporciona un número entero negativo como entrada.

Un programa debe tener un procedimiento a prueba de fallas para filtrar los datos ingresados para resolverlo.

En este programa para encontrar la secuencia collatz en Python, se importa el paquete de biblioteca sys. La función del sistema sys sale de los programas cuando se cumple una condición.

Se crea un método collatz_seq con un parámetro numb como el último programa.

import sys
def collatz_seq(numb):

Una sentencia if-elif comprueba si el número es par o impar. Si el número es par, el número se divide por 2 y el nuevo número se almacena dentro de la variable valor.

Si el número es impar, la variable valor se almacena con un valor multiplicado y sumado por 3 y 1, respectivamente.

if numb % 2 == 0:
    value = numb // 2
elif numb % 2 != 0:
    value = (3 * numb) + 1

A diferencia del último programa, el resultado actualizado se almacena dentro de la variable valor. Después del bloque if-elif, se crean dos bucles while.

El primer bucle while comprueba si el valor de la variable valor es 1 y luego imprime y sale del bucle si el caso se encuentra true. Si value no es 1, entonces el segundo ciclo while imprime el value y lo copia dentro de la variable numb.

while value == 1:
    print(value)
    sys.exit()

while value != 1:
    print(value)
    n = value

Por último, el método collatz_seq se llama recursivamente con el argumento numb. El método seguirá llamándose a sí mismo hasta que el valor se reduzca a 1, entonces el programa sale usando la función sys.exit().

return collatz_seq(numb)

Fuera del método collatz_seq, se crea una variable número que toma la entrada del usuario. Se agrega un bloque de manejo de excepciones para detectar entradas no válidas.

Dentro del bloque try, la variable number se toma como entrada entera. Se utiliza una declaración if para verificar si el número es negativo o no.

Si se encuentra true, se cambia la polaridad del número y se imprime un mensaje adecuado. Por último, se llama al método collatz_seq.

print('Enter a number: ')
try:
    number = int(input())
    if number < 0:
        number = abs(number)
        print("A negative number entered")
    collatz_seq(number)

Dentro del bloque excepto, se genera un ValueError para entradas que no sean un número entero, junto con un mensaje de error.

except ValueError:
    print('You must enter an integer type.')

El código completo se da a continuación.

import sys


def collatz_seq(numb):
    if numb % 2 == 0:  # Remainder = 0, Checks for even number
        value = numb // 2
    elif numb % 2 != 0:  # Remainder = 1, Checks for odd number
        value = (numb * 3) + 1

    while value == 1:  # If value is 1
        print(value)
        sys.exit()  # Program exits

    while value != 1:  # The loop runs until the value is not 1.
        print(value)
        numb = value  # Value of value is copied to numb
        return collatz_seq(numb)


print("Enter a number: ")  # Input statement
try:
    number = int(input())  # Typecast as Integer Input
    if number < 0:
        number = abs(number)
        print("A negative number entered")
    collatz_seq(number)
except ValueError:
    print("You must enter an integer type.")

Producción :

Enter a number:
10
5
16
8
4
2
1

Para una entrada inválida:

Enter a number:
j
You must enter an integer type.

Secuencia de Collatz en Python usando recursividad

Este programa encuentra la secuencia collatz en Python con una llamada de método diferente. El bloque with se crea fuera del método collatz para permitir que el programa siga tomando entradas durante un número determinado de veces.

El método collatz comprueba si el número es par o impar y realiza operaciones sobre él como el programa anterior. Fuera del método, el programa toma dos entradas; el primero toma un rango de bucle for.

Dentro de un bloque try, se proporciona la segunda entrada. El bucle while sigue llamando al método collatz hasta que el valor de numb se reduce a 1.

Dentro del bucle while, el valor de numb se pasa y se devuelve repetidamente.

def collatz_seq(numb):
    if numb % 2 == 0:  # even
        print(numb // 2)
        return numb // 2
    elif numb % 2 != 0:  # odd
        value = 3 * numb + 1
        print(value)
        return value


c = int(input("Enter count: "))
for c in range(c):
    try:
        n = input("Enter number: ")
        while n != 1:
            n = collatz_seq(int(n))
    except ValueError:
        print("Value Error. Please enter integer.")

Producción :

Enter count: 2
Enter number: 5
16
8
4
2
1
Enter number: 6
3
10
5
16
8
4
2
1

Secuencia de Collatz en Python usando el bucle while

Hasta ahora, hemos aprendido cómo crear un programa que imprima la secuencia collatz en Python para un número dado. En este programa también se calculó el número de iteraciones que tardó el programa en reducir el resultado a 1.

Se crea un método solve con un parámetro numb. Dentro de una sentencia if, el programa devuelve 0 si al parámetro se le da un valor = 0.

Se crea una nueva variable, longitud, que se utilizará para contar el número de iteraciones.

Se crea una variable longitud y se le asigna 1. Se crea un bucle while con la condición de salida numb != 1. Esto mantiene el bucle funcionando hasta que el valor de adormecer sea 1.

Dentro del bucle while, las operaciones en numb se ejecutan mediante una sola declaración. El entumecido se divide por 2 si es par, de lo contrario (3 * entumecido + 1).

Las operaciones se realizan en una sola instrucción de modo que el valor de longitud se actualiza con cada iteración.

numb = (numb / 2) if numb % 2 == 0 else (3 * numb + 1)

Se imprime el valor actual de numb y longitud, y luego longitud se incrementa en 1. El programa busca números pares o impares, actualiza numb y lo imprime.

Luego se incrementa la longitud para la siguiente operación.

En el último paso, el programa incrementa un 1 extra a longitud. Este número adicional se resta y se devuelve el recuento final de longitud.

Por último, se llama al método solve y se le pasa un argumento 10, y se imprime el resultado.

def solve(numb):
    if numb == 0:
        return 0
    length = 1
    while numb != 1:
        numb = (numb / 2) if numb % 2 == 0 else (3 * numb + 1)
        print("Count = ", length, "Value = ", numb)
        length += 1
    return length - 1


print("Total iterations = ", solve(10))

Producción :

Count =  1 Value =  5.0
Count =  2 Value =  16.0
Count =  3 Value =  8.0
Count =  4 Value =  4.0
Count =  5 Value =  2.0
Count =  6 Value =  1.0
Total iterations =  6

Conclusión

Este artículo proporciona varios ejemplos de creación de programas que muestran la secuencia collatz en Python. Después de leer el artículo, el lector puede crear una secuencia collatz en Python de varias maneras.

Artículo relacionado - Python Sequence