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.
21 Septiembre 2008 a las 06:06 |
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
23 Septiembre 2008 a las 08:04 |
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.
15 Octubre 2008 a las 16:04 |
[...] 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 [...]
16 Diciembre 2008 a las 14:10 |
amigos como puedo sacar un algoritmo que permita hallar el logaritmo de 3 numeros en forma recursiva