Recursión

De Wikipedia, la enciclopedia libre
(Redirigido desde «Recursion»)
Saltar a: navegación, búsqueda
Anuncio de cacao con una imagen recursiva. La mujer muestra un paquete idéntico al del propio anuncio, conteniendo así a otra mujer que muestra otro paquete más pequeño, de forma recursiva.
Imagen recursiva formada por un triángulo. Cada triángulo está compuesto de otros más pequeños, compuestos a su vez de la misma estructura recursiva.

Recurrencia, recursión o recursividad es la forma en la cual se especifica un proceso basado en su propia definición. Siendo un poco más precisos, y para evitar el aparente círculo sin fin en esta definición:

Un problema que pueda ser definido en función de su tamaño, sea este N, pueda ser dividido en instancias más pequeñas (< N) del mismo problema y se conozca la solución explícita a las instancias más simples, lo que se conoce como casos base, se puede aplicar inducción sobre las llamadas más pequeñas y suponer que estas quedan resueltas.

Para que se entienda mejor a continuación se exponen algunos ejemplos:

  • Factorial: Se desea calcular n! \, (el factorial de n \,, que se define como el producto de todos los enteros positivos de 1 \, a n \,). Se puede definir el problema de forma recurrente como n(n-1)! \,; como (n-1)! \, es menor que n! \, podemos aplicar inducción por lo que disponemos del resultado. El caso base es 0! \, que es 1 \,.
  • Algoritmo de ordenación por fusión: Sea v un vector de n elementos, podemos separar el vector en dos mitades. Estas dos mitades tienen tamaño n/2 por lo que por inducción podemos aplicar la ordenación en estos dos subproblemas. Una vez tenemos ambas mitades ordenadas simplemente debemos fusionarlas. El caso base es ordenar un vector de cero o un elemento, que está trivialmente ordenado y no hay que hacer nada.

En estos ejemplos podemos observar como un problema se divide en varias (una o más) instancias del mismo problema, pero de tamaño menor gracias a lo cual se puede aplicar inducción, llegando a un punto donde se conoce el resultado (el caso base).

Nota: aunque los términos "recursión" y "recursividad" son ampliamente empleados en el campo de la informática, el término correcto en castellano es recurrencia. Sin embargo este último término es algo más específico. Véase relación de recurrencia.

Recursión en matemáticas[editar]

Conjuntos definidos de forma recurrente[editar]

Un ejemplo de conjunto definido de forma recurrente es el de los números naturales, es decir, el conjunto de los números enteros no negativos:[1]

  1. 0 \, pertenece a ℕ.
  2. Si n \, pertenece a ℕ, entonces n+1 \, pertenece a ℕ.
  3. Si x \, verifica las anteriores condiciones, entonces x \, está incluido en ℕ [cita requerida].

Funciones definidas de forma recurrente[editar]

Aquellas funciones cuyo dominio es un conjunto a lo más enumerable [2] pueden ser definidas de forma recurrente.

Un ejemplo conocido es la definición recurrente de la función factorial n!:


n!=
\begin{cases} 
\mbox{si }n=0 & \Rightarrow 1  \\ 
\mbox{si }n\geq1 & \Rightarrow n \;(n-1)!
\end{cases}

Veamos cómo se usa esta definición para hallar el valor del factorial de 3:


\begin{align}
 3! & = 3 \cdot (3-1)! \\ 
 {} & = 3 \cdot 2! \\
 {} & = 3 \cdot 2 \cdot (2-1)! \\
 {} & = 3 \cdot 2 \cdot 1! \\
 {} & = 3 \cdot 2 \cdot 1 \cdot (1-1)! \\
 {} & = 3 \cdot 2 \cdot 1 \cdot 0! \\
 {} & = 3 \cdot 2 \cdot 1 \cdot 1 \\
 {} & = 6 \\
\end{align}

Otros ejemplos de funciones y sucesiones matemáticas definidas de forma recursiva son:

Constantes[editar]

La razón áurea se puede definir como sigue: \phi = 1 + \frac{1}{\phi} =  1 + \frac{1}{1 + \frac{1}{1 + \frac{1}{1 + ...}}}, como una fracción continua en que todos los números son unos.

De forma similar, la identidad \sqrt{x} = 1+\frac{x-1}{1+\sqrt{x}} da lugar a una definición como fracción continua de cualquier raíz cuadrada:[3] \sqrt{x}=1+\cfrac{x-1}{2 + \cfrac{x-1}{2 + \cfrac{x-1}{2+{\ddots}}}}

Resolución de problemas[editar]

Resolución de ecuaciones homogéneas de primer grado, segundo orden:

a) Se pasan al primer miembro los términos a_n, a_{n-1}, a_{n-2}, los cuales también podrían figurar como a_{n+2}, a_{n+1}, a_n

b) Se reemplaza a_n por r^2, a_{n-1} por r y a_{n-2} por 1, quedando una ecuación de segundo grado con raíces reales y distintas r_1 y r_2.

c) Se plantea  a = u\; r_1 n + v\; r_2 n

d) Debemos tener como dato los valores de los dos primeros términos de la sucesión: A_0 = k\, y A_1 = k^\prime. Utilizando estos datos ordenamos el sistema de 2x2:

\begin{cases}
u + v = k \\
u \; r_1 + u \; r_2 = k^\prime
\end{cases}

La resolución de este sistema nos da como resultado los valores u_0 y v_0, que son números reales conocidos.

e) La solución general es:

a_n = u_0 \; r_1 n + v_0 \; r_2 n

Recursión en informática[editar]

En programación, un método usual de simplificación de un problema complejo es la división de este en subproblemas del mismo tipo. Esta técnica de programación se conoce como divide y vencerás y es el núcleo en el diseño de numerosos algoritmos de gran importancia, así como también es parte fundamental de la programación dinámica.


El ejemplo del cálculo recursivo del factorial de un número llevado al campo de la programación, en este ejemplo C++:

int factorial(int x)
{
   if (x > -1 && x < 2) return 1;  // Cuando -1 < x < 2 devolvemos 1 puesto que 0! = 1 y 1! = 1
   else if (x < 0) return 0;       // Error no existe factorial de números negativos
   return x * factorial(x - 1);    // Si x >= 2 devolvemos el producto de x por el factorial de x - 1
}

El seguimiento de la recursividad programada es casi exactamente igual al ejemplo antes dado, para intentar ayudar a que se entienda mejor se ha acompañado con muchas explicaciones y con colores que diferencia los distintos sub-procesos de la recursividad.

X = 3 //Queremos 3!, por lo tanto X inicial es 3
X >= 2 -> return 3*factorial(2);
    X = 2 //Ahora estamos solicitando el factorial de 2
    X >= 2 -> return 2*factorial(1);
        X = 1 // Ahora estamos solicitando el factorial de 1
        X < 2 -> return 1;
        [En este punto tenemos el factorial de 1 por lo que volvemos marcha atrás resolviendo todos los resultados]
    return 2 [es decir: return 2*1 = return 2*factorial(1)]
return 6 [es decir: return 3*2 = return 3*factorial(2)*factorial(1)] // El resultado devuelto es 6


Algoritmo implementado en el lenguaje Prolog:

fact(0,1):-!.
fact(N,F):-N1 is N-1,fact(N1,F1),F is N*F1.

Humor recursivo[editar]

La recursividad se emplea a menudo de forma humorística en textos informáticos, filosóficos o matemáticos. No es raro que un libro de texto de estas disciplinas incluya en su glosario una entrada similar a esta:

Recursividad, véase Recursividad.[4]

En el buscador Google, al buscar «recursion», el sitio sugiere «Quizá quisiste decir: recursion».[5]

Un chiste informático dice así: «Para entender la recursividad, debes entender la recursividad».[4] En la informática también es común la elección de acrónimos recursivos. PHP son las iniciales de PHP Hypertext Preprocessor (Preprocesador de Hipertexto PHP), WINE son las de WINE Is Not an Emulator (WINE no es un emulador) y GNU significa GNU's Not Unix (GNU no es Unix).

Véase también[editar]

Referencias[editar]

  1. Algunos autores consideran que los números naturales son los números enteros positivos, es decir, excluyen el 0 de este conjunto. En ese caso, basta sustituir la línea que dice «0 \, pertenece a ℕ» por «1 \, pertenece a ℕ».
  2. «Nociones de espacios normados» , Cotlar y Cignoli, Eudeba, Buenos Aires
  3. Ben Thurston, "Estimating square roots, generalized continued fraction expression for every square root", The Ben Paul Thurston Blog
  4. a b Hunter, David (2011). Essentials of Discrete Mathematics. Jones and Bartlett. p. 494. 
  5. Daniel Rodríguez Herrera (29-07-2009). «¿Qué es la recursividad? ¿Qué es la recursividad? ¿Qué es la recursividad?...». Libertad Digital. Consultado el 20-01-2013.

Enlaces externos[editar]