Sie sind auf Seite 1von 12

Repblica Bolivariana de Venezuela Ministerio del Poder Popular para la Defensa Universidad Nacional Experimental de la Fuerza Armada Nacional

Profesor: Luis Sequera.

Integrante: Ortega Mariannis.

Recursividad.
Recurrencia, recursin o recursividad es la forma en la cual se especifica un proceso basado en su propia definicin. Siendo un poco ms precisos, y para evitar el aparente crculo sin fin en esta definicin: Un problema que pueda ser definido en funcin de su tamao, sea este N, pueda ser dividido en instancias ms pequeas (< N) del mismo problema y se conozca la solucin explcita a las instancias ms simples, lo que se conoce como casos base, se puede aplicar induccinsobre las llamadas ms pequeas y suponer que estas quedan resueltas. Para que se entienda mejor a continuacin se exponen algunos ejemplos:

Factorial: Se desea calcular (el factorial de , que se define como el producto de todos los enteros positivos de a ). Se puede definir el problema de forma recurrente como ; como es menor que podemos aplicar induccin por lo que disponemos del resultado. El caso base es que es .

Algoritmo de ordenacin por fusin:

Sea v un vector de n elementos, podemos separar el vector en dos mitades. Estas dos mitades tienen tamao n/2 por lo que por induccin podemos aplicar la ordenacin 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 ms) instancias del mismo problema, pero de tamao menor gracias a lo cual se puede aplicar induccin, llegando a un punto donde se conoce el resultado (el caso base).

Es importante Notar: Aunque los trminos "recursin" y "recursividad" son ampliamente empleados en el campo de la informtica, el trmino correcto en castellano es recurrencia. Sin embargo este ltimo trmino es algo ms especfico.

Procedimientos recursivos
En el siguiente procedimiento se utiliza la recursividad para calcular el factorial de su argumento original.

Por ejemplo:
Functionfactorial(ByVal n AsInteger) AsInteger If n <= 1 Then Return 1 Else Returnfactorial(n - 1) * n EndIf EndFunction

Ejemplo:

Un conjunto definido de forma recurrente es el de los nmeros naturales, es decir, el conjunto de los nmeros enteros no negativos: 1. pertenece a . 2. Si pertenece a , entonces pertenece a . 3. Si verifica las anteriores condiciones, entonces incluido en .

est

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

Ejemplo:
Conocido es la definicin recurrente de la funcin factorial n!:

Esta definicin se usa para hallar el valor del factorial de 3:

Consideraciones sobre procedimientos recursivos


Condiciones de limitacin. Debe designar un procedimiento recursivo para probar al menos una condicin que pueda poner fin a la recursividad; tambin debe supervisar los casos en los que no se satisface ninguna condicin dentro de un nmero razonable de llamadas recursivas. Si no existe al menos una condicin que pueda cumplirse sin errores, el procedimiento corre un riesgo elevado de ejecutarse en un bucle infinito. Uso de la memoria. La aplicacin tiene una cantidad de espacio limitada para las variables locales. Cada vez que un procedimiento se llama a s mismo, utiliza ms cantidad de ese espacio para las copias adicionales de sus variables locales. Si este proceso contina indefinidamente, se acaba produciendo un error StackOverflowException. Eficacia.

Casi siempre se puede sustituir un bucle por la recursividad. Un bucle no tiene la sobrecarga de transferir argumentos, inicializar el almacenamiento adicional y devolver valores. Su rendimiento puede ser mucho mayor sin llamadas recursivas. Recursividad mutua Si dos procedimientos se llaman mutuamente, el rendimiento puede ser muy deficiente o incluso puede producirse un bucle infinito. Este tipo de diseo presenta los mismos problemas que un procedimiento recursivo nico, pero puede ser ms difcil de detectar y depurar. Llamadas con parntesis. Cuando un procedimiento Function se llama a s mismo de manera recursiva, debe agregar parntesis detrs del nombre del procedimiento, aun cuando no exista una lista de argumentos. De lo contrario, se considerar que el nombre de la funcin representa al valor devuelto por sta. Pruebas. Si escribe un procedimiento recursivo, debe probarlo minuciosamente para asegurarse de que siempre cumple ciertas condiciones de limitacin. Tambin debera comprobar que la memoria no resulta insuficiente debido a la gran cantidad de llamadas recursivas.

Ejemplo 1:
Posteriormente se muestra nuevamente el problema de la resolucin de la factorial, pero pidiendo el valor que deseamos hallar por teclado.

#include <stdio.h> #include <conio.h> main() { clrscr(); int n; long int factorial (int n); printf("Introducir la cantidad entera a la que le queremos hallar el factorial: "); scanf("%d", &n); printf("%d! = %d\n", n, factorial(n)); getch(); } long int factorial (int n) /* Calcular el factorial */

{ if (n <= 1) return(1); else return(n * factorial (n-1)); } Cuando ejecutamos un programa recursivo, las llamadas recursivas no se ejecutan inmediatamente. Lo que se hace es colocarlas en una pila hasta que la condicin de trmino se encuentra. Entonces se ejecutan las llamadas a la funcin en orden inverso a como se generaron, como si se fueran sacando de la pila, por tanto el orden sera algo as: 1 n! = n* (n-1)! 2 (n-1)! = (n-1) * (n-2)! 3 (n-2)! = (n-2) * (n-3)! ........ ltimo 2! = 2 * 1!

Los valores reales se devolvern en orden inverso, es decir:

1 1!=1 2 2! = 2 * 1! = 2 * 1 = 2 3 3! = 3 * 2! = 3 * 2 = 6 ........ ............... ltimo n! = n * (n-1)!= ....

El orden inverso de ejecucin es una caracterstica tpica de todas las funciones recursivas. Si una funcin recursiva tiene variables locales, se crear un conjunto diferente de variables locales durante cada nueva llamada. Los nombres de las variables

locales sern los mismos, como los hallamos declarado en la funcin. Sin embargo, las variables representarn un conjunto diferente de valores cada vez que se ejecute la funcin. Cada conjunto de valores se almacenar en la pila, as cuando el proceso recursivo se deshaga (cuando las llamadas a la funcin se saquen de la pila y sigan su ejecucin) podremos disponer de ellas. En cada llamada de recursiva el compilador utiliza una nueva zona de la pila para almacenar las variables. Esto hace que la administracin de la pila enlentezca la ejecucin de la funcin y pueda dar problemas por agotamiento de la memoria de la pila. Por tanto, como toda funcin recursiva se puede calcular de forma iterativa, es aconsejable utilizar este ltimo modo cuando sea fcil de encontrar.

Ejemplo 2:
Escriba una funcin recursiva para calcular la potencia de exponente entero de un nmero. Pruebe la funcin en un programa C. Recuerde que an=a * an-1 #include <iostream.h> #include <conio.h> long pot(int x, int y); int main(int argc, char *argv[]) { int base, exp, ress; clrscr();

cout<<"ingrese base: "; cin>>base; cout<<"ingrese exponente: "; cin>>exp; ress= pot(base, exp); cout<<ress; getch(); return 0; } long pot(int x, int y){ if (y==0){ return(1); }else{ return(x*pot(x,y-1)); } }

Das könnte Ihnen auch gefallen