Sei sulla pagina 1di 5

UNIVERSIDAD ANDINA DEL CUSCO FACULTAD DE INGENIERA DEPARTAMENTO ACADEMICO DE INGENIERIA DE SISTEMAS PROGRAMA ACADEMICO PROFESIONAL DE INGENIERA DE SISTEMAS

Recursividad
1. COMPETENCIAS A CONSEGUIR

Desarrollar la solucin de un problema principal dividiendo en subproblemas utilizando la tcnica de divide y vencers. Utilizar la recursividad como una alternativa a la utilizacin de las estructuras de control iterativas.

2. Marco Terico
El concepto de recursividad va ligado al de repeticin. Son recursivos aquellos algoritmos que, estando encapsulados dentro de una funcin, son llamados desde ella misma una y otra vez. Algo es recursivo si se define en trminos de s mismo (cuando para definirse hace mencin a s mismo). Para que una definicin recursiva sea vlida, la referencia a s misma debe ser relativamente ms sencilla que el caso considerado. La recursividad es una poderosa herramienta de programacin siendo una alternativa a las estructuras de control iterativas. En general las soluciones recursivas son menos eficientes que las iterativas; sin embargo, en muchos casos, la recursividad permite especificar soluciones simples, elegantes y naturales a problemas que de otro modo seran muy difciles de resolver. Para entender la recursividad se requiere de un entendimiento de los subprogramas. Las caractersticas de los subprogramas son: Todo subprograma debe tener un estructura ce caja negra. Esto significa: o Puede admitir parmetros de entrada o Efecta un proceso en funcin a los parmetros de entrada o Devuelve el o los resultados del proceso como parmetro de salida.

Un subprograma puede ser invocado desde el programa principal o desde otro subprograma, y este puede invocar a otro subprograma y este a otro y as sucesivamente. Se puede establecer una cadena de llamadas a subprogramas. Cuando un subprograma termina se ejecutarse, el control del programa regresa al punto desde donde se envi al subprograma. Se debe evitar en lo posible el uso de variables globales. La forma de comunicacin entr el programa y el subprograma es a travs de al lista de parmetros y se establece un correspondencia automtica entre los parmetros actuales y formales. Concepto Bsico de recursividad

La recursividad en aquella propiedad que posee una funcin por la cual dicha funcin puede llamarse as misma. Se puede utilizar la recursividad como una forma alternativa a la iteracin. Una solucin recursiva es normalmente menos eficiente en trminos de tiempo de computadora que una solucin iterativa debido a las operaciones auxiliares que lleva consigo las llamadas suplementarias a las funciones, sin embargo, en muchas circunstancias el uso, de las recursividad permite a los programadores especificar soluciones naturales, sencillas, que serian, en caso contrario difciles de resolver. Se dice que un mtodos es recursivo si contiene llamadas o invocaciones a si mismo. Un mtodo recursivo tendra este aspecto: metodoRecursivo () { metodoRecursivo(); //llamada recursiva } Esto implica que una llamada al mtodo recursivo puede generar una o ms invocaciones al mismo mtodo, que a su vez genera invocaciones, y as sucesivamente.
Ing Cesar Medina Victorio 1

UNIVERSIDAD ANDINA DEL CUSCO FACULTAD DE INGENIERA DEPARTAMENTO ACADEMICO DE INGENIERIA DE SISTEMAS PROGRAMA ACADEMICO PROFESIONAL DE INGENIERA DE SISTEMAS

A primera vista, parece que un mtodo recursivo nunca terminar; pero si la definicin est bien hecha y los parmetros de entrada son adecuados, alguna llamada activar un mtodo que no generar nuevas llamadas, con lo cual este mtodo terminar y devolver el control a la llamada anterior, que a su vez terminar, y as sucesivamente, hasta que todas las llamadas terminen. En un algoritmo recursivo distinguimos como mnimo 2 partes: a) Caso trivial, base o de fin de recursin: Es un caso donde el problema puede resolverse sin tener que hacer uso de una nueva llamada a s mismo. Evita la continuacin indefinida de las partes recursivas. b) Parte puramente recursiva: Relaciona el resultado del algoritmo con resultados de casos ms simples. Se hacen nuevas llamadas a la funcin, pero estn ms prximas al caso base Ejemplo:

ITERATIVO:
static int FactorialIterativo( int n ) { int i, res=1; for (i = 1; i <= n; i++) { res = res * i; } return(res); }

RECURSIVO:
static int factorial(int n) { //------------caso base--------------if (n==0 || n==1) { return 1; } else { //----------caso recursivo----------return n*factorial(n-1); } }

TIPOS DE RECURSIN

Recursividad simple: Aquella en cuya definicin slo aparece una llamada recursiva. Se puede transformar con facilidad en algoritmos iterativos. Recursividad mltiple: Se da cuando hay ms de una llamada a s misma dentro del cuerpo de la funcin, resultando ms dificil de hacer de forma iterativa. int Fib( int n ) */ { if(n<=1) return(1); return(Fib(n-1) + Fib(n-2)); } /* ej: Fibonacci

Recursividad anidada: En algunos de los arg. de la llamada recursiva hay una nueva llamada a s misma. int Ack( int n, int m ) { if(n==0 ) return(m+1); else if(m==0) return(Ack(n-1,1)); return(Ack(n-1, Ack(n,m-1))); } /* ej: Ackerman */

Ing Cesar Medina Victorio 2

UNIVERSIDAD ANDINA DEL CUSCO FACULTAD DE INGENIERA DEPARTAMENTO ACADEMICO DE INGENIERIA DE SISTEMAS PROGRAMA ACADEMICO PROFESIONAL DE INGENIERA DE SISTEMAS

Recursividad cruzada o indirecta: Son algoritmos donde una funcin provoca una llamada a s misma de forma indirecta, a travs de otras funciones. Ej: Par o Impar: int par( int nump ) { if(nump==0) return(1); return( impar(nump-1)); } int impar( int numi ) { if(numi==0) return(0); return( par(numi-1)); }

3. Desarrollo del Prctica:


1. Una de las funciones matemticas recursivas ms sencillas es la funcin factorial.
Datos 0! 1! 2! 3! 4! 5! 6! 0! = 1 1! = 1 2! = 2 * 1 3! = 3 * 2 * 1 4! = 4 * 3 * 2 * 1 5! = 5 * 4 * 3 * 2 * 1 n! = n*(n-1)! n! = 1 Resultado 1 1 2 6 24 120 720

=2 * 1! =3 * 2! =4 * 3! =5 * 4! para n > 1 (caso recursivo) para n = 0 1 (caso base)

using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 {


Ing Cesar Medina Victorio 3

UNIVERSIDAD ANDINA DEL CUSCO FACULTAD DE INGENIERA DEPARTAMENTO ACADEMICO DE INGENIERIA DE SISTEMAS PROGRAMA ACADEMICO PROFESIONAL DE INGENIERA DE SISTEMAS

class Program { static int factorialRecursivo(int n) { //-------------caso base--------------if (n == 0 || n == 1) { return 1; } else { //------------caso recursivo----------return n * factorialRecursivo(n - 1); } } static int FactorialIterativo( int n ) { int i, res=1; for (i = 1; i <= n; i++) { res = res * i; } return(res); } public static void Main(string[] args) { int n; Console.Write("ingrese n: "); n = int.Parse(Console.ReadLine()); //Console.WriteLine("el factorial de " + n + " es =" + factorialRecursivo(n)); Console.WriteLine("el factorial de " + n + " es =" + FactorialIterativo(n)); Console.ReadLine(); } } }

1. Escribir un subprograma recursivo para determinar el n-esimo termino de la serie fibonaci.

Ing Cesar Medina Victorio 4

UNIVERSIDAD ANDINA DEL CUSCO FACULTAD DE INGENIERA DEPARTAMENTO ACADEMICO DE INGENIERIA DE SISTEMAS PROGRAMA ACADEMICO PROFESIONAL DE INGENIERA DE SISTEMAS

using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 { class Program { static int FibonacciRecursivo(int n) { if (n == 1 || n == 2) // ---- caso base return 1; else // ---- caso recursivo return Fibonacci(n -1) + Fibonacci(n - 2); } static int FibonacciIterativo(int n) { int j = 0; int i = 1; for (int k = 1; k <= n; k++) { int t = i + j; i = j; j = t; } return j; } static void Main() { int n; Console.WriteLine("Fibonacci (n-esimo termino) - Recursivo"); Console.WriteLine("======================================="); Console.Write("\nIngrese un numero : "); n = int.Parse(Console.ReadLine()); //Console.WriteLine("\nEl " + n + " termino de la sucesion de Fibonacci es " + FibonacciRecursivo (n)); Console.WriteLine("\nEl " + n + " termino de la sucesion de Fibonacci es " + FibonacciIterativo(n)); Console.ReadLine(); } } }

Ejercicios propuestos:

Disea un procedimiento recursivo que escriba los nmeros impares no primos. Disea un procedimiento recursivo que escriba las cifras de un nmero N en orden inverso. Disear un procedimiento recursivo que saque las cifras de un nmero entero en su mismo orden; la salida para 1051 debe ser 1, 0, 5, 1. Escriba una funcin recursiva para calcular el trmino n-simo de la secuencia de Lucas: 1, 3, 4, 7, 11, 18, 29, 47,... Realizar un mtodo recursivo que imprima en pantalla las cifras de un nmero dado, en orden inverso.

Investigacin
1.2.3.4.5.Multiplicacin Rusa Torres de Hanoi Salto del Caballo Ocho Reinas Cuadrado Mgico

Ing Cesar Medina Victorio 5

Potrebbero piacerti anche