Skip to content
 

Problema de Syracuse (Conjetura de Collatz)

Hola, en este artículo vamos a ejemplificar y aplicar la recursividad de la conjetura de Collatz, si necesitas información matemática puedes recurrir a la wikipedia, quien redacta este artículo es estudiante de Ingeniería de Sistemas (futuro programador).

El problema Syracuse o Conjetura de Collatz es una función recursiva y las condiciones son las siguientes:

Si N es par, lo dividimos [N/2];
Si N es impar, lo multiplicamos por 3 y sumamos +1 [3N+1];

Siendo N un numero entero positivo; es necesario que N sea un numero entero positivo ya que si fuese real (con coma decimal) nuestro ordenador no podría saber si es “par o impar” debido a que una de las formas de saber si un número es par o impar es mediante el “módulo” el cual halla el residuo de una división, si el residuo de N y 2 es 0, entonces N es par!.

Comencemos:
Necesitamos crear una funcion recursiva, nuestra función se llamará syr(), el parámetro de entrada es una variable de tipo entero (por que si fuera double o float simplemente no existiría el módulo (residuo)), obviamente nuestra función syr() devuelve un valor entero!

Si N es 1, retornamos 1;
Sino, Si el módulo (residuo) de N y 2 es 0, retornamos N/2;
Sino, retornamos 3*N+1;

Veamos lo que pasa si N valiese 5:
5 % 2 == 0 ?? NO!
entonces >> n = 3*5 + 1, [n = 16];
16% 2 == 0 ?? SI!
entonces >> n = 16/2, [n = 8];
8% 2 == 0?? SI!
entonces >> n = 8/2, [n = 4];
4 % 2 == 0?? SI!
entonces >> n = 4/2, [n = 2];
2%2 == 0?? SI!
entonces >> n = 2/2. [n= 1]
1 == 1?? SI!
Fin de la secuencia, llegamos a 1!

EN PHP sería de la siguiente manera:

syr($n)
{
  echo $n; //mostramos $n
  if ($n == 1) //si $n es 1, devolvemos 1
    return 1;
  else //sino ...
  {
    if ($n%2 == 0) // si es par
      return syr($n/2); // lo dividimos
    else //sino
      return syr(3*n+1); // multiplicamos por 3 y sumamos 1;
  }
}

El código ignoranto tiene el algoritmo escrito en C# y PHP; también podemos probar la Serie de Syracuse solo con números enteros menores de 1e5 (sino se sobre carga el server)!

3 Comments

  1. Mikiman dice:

    interesante eso de la recursividad.

  2. pedro dice:

    como calculamos el tiempo de vuelo en altitud

  3. gerWare(); dice:

    Hola Pedro, no tengo ni idea, pero quizá si me orientas podamos hacer algo; te cuento, soy (futuro) Programador y de matemática se poco!

Leave a Reply