Factorial sin función recursiva, sólo SQL.

El cálculo de un factorial se suele poner como ejemplo de utilización de función recursiva. Oracle no tiene esa función (al menos por ahora) dentro de sus funciones ‘built in’ (incorporadas).

Es fácil compilar una función que acepte un parámetro numérico y devuelva su factorial. Basta con iterar un decremento de uno sobre el parámetro de entrada e ir multiplicando mientras el parámetro decrementado sea mayor que cero.

Pero ¿podría hacerse en PURO SQL, sin necesidad de recurrir a compilar la función de marras?

En eso estaba yo pensando y no sabía muy bien cómo afrontar el problema, hasta que me acordé de mis años mozos y de un profesor de matemáticas diciéndome que ‘los logaritmos convierten productos en sumas’ ( ln(a*b) = ln(a)+ln(b) ). También me acordé de otro que me decía que los ‘logaritmos y las exponenciales son funciones inversas’. Y así pensando pensando se me ocurrió esto:


carlos@db01.xxxxxx> set verify off

carlos@db01.xxxxxx>  SELECT EXP( SUM(LN(level))) FACTORIAL
 2 FROM DUAL CONNECT BY LEVEL  <= &numero
/
Introduzca un valor para numero: 3

 FACTORIAL
----------
         6

carlos@db01.xxxxxx> /
Introduzca un valor para numero: 4

 FACTORIAL
----------
        24

carlos@db01.xxxxxx> /
Introduzca un valor para numero: 5

 FACTORIAL
----------
       120

carlos@db01.xxxxxx> /
Introduzca un valor para numero: 6

 FACTORIAL
----------
       720

carlos@db01.xxxxxx> /
Introduzca un valor para numero: 7

 FACTORIAL
----------
      5040

carlos@db01.xxxxxx> /
Introduzca un valor para numero: 8

 FACTORIAL
----------
     40320

carlos@db01.xxxxxx> /
Introduzca un valor para numero: 9

 FACTORIAL
----------
    362880

carlos@db01.xxxxxx> /
Introduzca un valor para numero: 10

 FACTORIAL
----------
   3628800

carlos@db01.xxxxxx>

Otra prueba más de que hay muy pocas cosas que no se puedan hacer con simple SQL.

Saludos.

Carlos.

4 respuestas a Factorial sin función recursiva, sólo SQL.

  1. Paul dice:

    Carlitos, hola, mis respetos! Carlos
    Sabes, me he perdido una gran oprtunidad por no poder conectar un algoritmo llamado GRASP que si le das una cantidad, de una lista de cantidades, debes hallar todas las demas cantidades, de esa misma lista, que sumen exacta o cercanamente a la cantidad dada al principio. Ejemplo:
    lista: 1,2,3,4,5
    Ingrese cuenta: 5
    resultado: 2,3

    Ingrese cuenta: 6
    resultado: 1,2,3

    Ingrese cuenta: 4
    resultado: 3
    diferencia: 1

    Obviamente, las cantidades eran de miles.
    Yo les propuse hacerlo en SQL puro pero ellos ya tenian al PLSQL, ¿Puedes darme una demostracion de tus conocimientos? ¿como lo harias, con lo ya hecho o con SQL puro?

    por lo demas, gracias por atenderme

  2. carlosal dice:

    Paul:

    Así como lo explicas, necesitaría más información, ya que los algoritmos GRASP consisten en elegir la mejor de varias soluciones posibles a un problema. Pero esa solución será ‘mejor’ que otras basándose en ciertos criterios que tú no indicas (¿Por qué 2,3 es mejor que 4,1?).

    Por otra parte, no hay nada malo en hacerlo en PL/SQL. La idea del ‘post’ era señalar que el SQL es menos rígido de lo que dicen algunos.

    Un saludo.

    Carlos.

  3. […] ocasiones resulta ser una herramienta muy útil. Ya hemos visto ejemplos de ello en Oracle: calcular un factorial, convertir cadenas a tablas y tablas a cadenas, pero hay muchas otras tareas para las que el SQL […]

  4. Juan dice:

    amigos como puedo sacar un algoritmo que permita hallar el logaritmo de 3 numeros en forma recursiva

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: