Sei sulla pagina 1di 7

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(x: Entero): Sea N := x el tamaño del problema, podemos definir el problema de
forma recurrente como x*Factorial(x - 1); como el tamaño de Factorial(x - 1) es menor que
N podemos aplicar inducción por lo que disponemos del resultado. El caso base es el
Factorial(0) que es 1.

 Ordenación por fusión(v: vector): Sea N := tamaño(v), 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 0 elementos, que
está trivialmente ordenado y no hay que hacer nada.

En estos ejemplos podemos observar como un problema se divide en varias (>= 1) 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.

Contenido

 [ocultar] 

 1 Los números naturales

 2 Funciones definidas de forma recurrente

 3 Algoritmo recursivo

 4 Ejemplos de recurrencias

 5 Véase también

 6 Enlaces externos

[editar] Los números naturales


Un ejemplo de conjunto definido de forma recurrente es el de los números naturales:

a) 0 pertenece a N

b) Si n pertenece a N, entonces n+1 pertenece a N

c) Si X verifica a) y b) , entonces X está incluido en N

Los números naturales es el conjunto de números enteros no negativos.

[editar] Funciones definidas de forma recurrente

Aquellas funciones cuyo dominio puede ser recursivamente definido pueden ser definidas de
forma recurrente.

El ejemplo más conocido es la definición recurrente de la función factorial n!:

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

3! = 3 · (3-1)!

= 3 · 2!

= 3 · 2 · (2-1)!

= 3 · 2 · 1!

= 3 · 2 · 1 · (1-1)!

= 3 · 2 · 1 · 0!

=3·2·1·1

=6

[editar] Algoritmo recursivo

Artículo principal: Algoritmo recursivo.

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.

[editar] Ejemplos de recurrencias

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


a) Se pasan al primer miembro los términos , , , los cuales también podrían figurar
como , ,

b) Se reemplaza por , por y por , quedando una ecuación de segundo grado


con raíces reales y distintas y .

c) Se plantea

d) Debemos tener como dato los valores de los dos primeros términos de la sucesión: y
. Utilizando estos datos ordenamos el sistema de 2x2:

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

e) La solución general es:

La recursividad es una técnica de programación importante. Se utiliza para realizar una llamada a
una funcion desde la misma funcion. Como ejemplo útil se puede presentar el calculo de números
factoriales. Él factorial de 0 es, por definición, 1. Los factoriales de números mayores se calculan
mediante la multiplicación de 1 * 2 * …, incrementando el número de 1 en 1 hasta llegar al
número para el que se está calculando el factorial.

El siguiente parrafo muestra una función, expresada con palabras, que calcula un factorial.

“Si el número es menor que cero, se rechaza. Si no es un entero, se redondea al siguiente entero.
Si el número es cero, su factorial es uno. Si el número es mayor que cero, se multiplica por él
factorial del número menor inmediato.”

Para calcular el factorial de cualquier número mayor que cero hay que calcular como mínimo el
factorial de otro número. La función que se utiliza es la función en la que se encuentra en estos
momentos, esta función debe llamarse a sí misma para el número menor inmediato, para poder
ejecutarse en el número actual. Esto es un ejemplo de recursividad.

La recursividad es un concepto importante en informatica. Muchos algoritmos se pueden describir


mejor en terminos de recursividad.

Supongamos que P es un procedimiento que contiene una sentencia de Llamada a si mismo o una
sentencia de Llamada a un segundo procedimiento que puede eventualmente llamar de vuelta al
procedimiento original P. Entonces P se dice que es u procedimiento recursivo. Como el progrma
no ha de continuar ejecutandose indefinidamente, un procedimiento recursivo ha de tener las dos
siguientes propiedades:

(1) Debe existir un cierto criterio, llamado criterio base, por el que el procedimiento no se llama asi
mismo.

(2) Cada vez que el procedimiento se llame a si mismo(directa o inderectamente), debe estar mas
cerca del criterio base.

Un procedimiento recursivo con estas dos propiedades se dice que esta bien definido.

Similarmente, una funcion se dice que esta definida recursivamente si la definicion de la funcion se
refiere a si misma. De nuevo, para que la definicion no sea circular, debe tener las dos siguientes
propiedades:

(1) Debe haber ciertos argumentos, llamados valores base, para los que la funcion no se refiera a si
misma.

(2) Cada vez que la funcion se refiera a si misma, el argumento de la funcion debe acercarse mas al
valor base.

Una funcion recursiva con estas dos propiedades se dice tambien que esta bien definida.

Tipos.

Podemos distinguir dos tipos de recursividad:

Directa: Cuando un subprograma se llama a si mismo una o mas veces directamente. Indirecta:
Cuando se definen una serie de subprogramas usándose unos a otros.

Características.

Un algoritmo recursivo consta de una parte recursiva, otra iterativa o no recursiva y un acondición
de terminación. La parte recursiva y la condición de terminación siempre existen. En cambio la
parte no recursiva puede coincidir con la condición de terminación. Algo muy importante a tener
en cuenta cuando usemos la recursividad es que es necesario asegurarnos que llega un momento
en que no hacemos más llamadas recursivas. Si no se cumple esta condición el programa no
parará nunca.

Ventajas e inconvenientes. La principal ventaja es la simplicidad de comprensión y su gran


potencia, favoreciendo la resolución de problemas de manera natural, sencilla y elegante; y
facilidad para comprobar y convencerse de que la solución del problema es correcta. El principal
inconveniente es la ineficiencia tanto en tiempo como en memoria, dado que para permitir su uso
es necesario transformar el programa recursivo en otro iterativo, que utiliza bucles y pilas para
almacenar las variables.
Ejemplo:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

namespace WindowsApplication1

public partial class Recursividad : Form

public Recursividad()

InitializeComponent();

double r;

int fin = 0;

private void button1_Click(object sender, EventArgs e)

fin = int.Parse(textBox4.Text.ToString());

listBox1.Items.Clear();

listBox1.Items.Add("x\ty");

evaluar();
}

//Procedimiento recusivo

public void evaluar()

while (fin <= int.Parse(textBox5.Text.ToString()))

r = int.Parse(textBox1.Text.ToString()) * (fin * fin) + int.Parse(textBox2.Text.ToString()) *


fin + int.Parse(textBox3.Text.ToString());

listBox1.Items.Add(fin.ToString() + "\t" + r.ToString());

fin++;

evaluar();

Potrebbero piacerti anche