0 - guia nº recursividad

7

Click here to load reader

Upload: cesar-medina

Post on 13-Apr-2015

22 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: 0 - Guia Nº Recursividad

UNIVERSIDAD ANDINA DEL CUSCOFACULTAD DE INGENIERÍA

DEPARTAMENTO ACADEMICO DE INGENIERIA DE SISTEMASPROGRAMA ACADEMICO PROFESIONAL DE INGENIERÍA DE

SISTEMAS

RecursividadRecursividad

1. COMPETENCIAS A CONSEGUIR

Desarrollar la solución de un problema principal dividiendo en subproblemas utilizando la técnica de divide y vencerás.

Utilizar la recursividad como una alternativa a la utilización de las estructuras de control iterativas.

2. Marco Teórico

El concepto de recursividad va ligado al de repetición. Son recursivos aquellos algoritmos que, estando encapsulados dentro de una función, son llamados desde ella misma una y otra vez.

Algo es recursivo si se define en términos de sí mismo (cuando para definirse hace mención a sí mismo). Para que una definición recursiva sea válida, la referencia a sí misma debe ser relativamente más sencilla que el caso considerado. La recursividad es una poderosa herramienta de programación 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 serían muy difíciles de resolver.

Para entender la recursividad se requiere de un entendimiento de los subprogramas. Las características de los subprogramas son:

Todo subprograma debe tener un estructura ce caja negra. Esto significa:o Puede admitir parámetros de entrada o Efectúa un proceso en función a los parámetros de entrada o Devuelve el o los resultados del proceso como parámetro 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 comunicación entré el programa y el subprograma es a través de al lista de parámetros y se establece un correspondencia automática entre los parámetros actuales y formales.

Concepto Básico de recursividad

La recursividad en aquella propiedad que posee una función por la cual dicha función puede llamarse así misma. Se puede utilizar la recursividad como una forma alternativa a la iteración. Una solución recursiva es normalmente menos eficiente en términos de tiempo de computadora que una solución 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 difíciles de resolver.

Se dice que un métodos es recursivo si contiene llamadas o invocaciones a si mismo.Un método recursivo tendría este aspecto:

…metodoRecursivo (…){

…metodoRecursivo(…);//llamada recursiva…

}

Esto implica que una llamada al método recursivo puede generar una o más invocaciones al mismo método, que a su vez genera invocaciones, y así sucesivamente.A primera vista, parece que un método recursivo nunca terminará; pero si la definición está bien hecha y los parámetros de entrada son adecuados, alguna llamada activará un método que no generará nuevas

Ing Cesar Medina Victorio

1

Page 2: 0 - Guia Nº Recursividad

UNIVERSIDAD ANDINA DEL CUSCOFACULTAD DE INGENIERÍA

DEPARTAMENTO ACADEMICO DE INGENIERIA DE SISTEMASPROGRAMA ACADEMICO PROFESIONAL DE INGENIERÍA DE

SISTEMAS

llamadas, con lo cual este método 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 mínimo 2 partes: a) Caso trivial, base o de fin de recursión:

Es un caso donde el problema puede resolverse sin tener que hacer uso de una nueva llamada a sí mismo. Evita la continuación indefinida de las partes recursivas.

b) Parte puramente recursiva: Relaciona el resultado del algoritmo con resultados de casos más simples. Se hacen nuevas llamadas a la función, pero están más próximas al caso base

Ejemplo:

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

static int factorial(int n){//------------caso base---------------

if (n==0 || n==1){

return 1;}else{

//----------caso recursivo----------- return n*factorial(n-1);}

}

TIPOS DE RECURSIÓN

Recursividad simple: Aquella en cuya definición sólo aparece una llamada recursiva. Se puede transformar con facilidad en algoritmos iterativos.

Recursividad múltiple: Se da cuando hay más de una llamada a sí misma dentro del cuerpo de la función, resultando más dificil de hacer de forma iterativa.

int Fib( int n ) /* ej: Fibonacci

*/ { if(n<=1) return(1); return(Fib(n-1) + Fib(n-2)); } Recursividad anidada: En algunos de los arg. de la llamada recursiva hay una nueva llamada a sí

misma. int Ack( int n, int m ) /* ej: Ackerman */ { if(n==0 ) return(m+1); else if(m==0) return(Ack(n-1,1)); return(Ack(n-1, Ack(n,m-1))); } Recursividad cruzada o indirecta: Son algoritmos donde una función provoca una llamada a sí

misma de forma indirecta, a través de otras funciones.

Ing Cesar Medina Victorio

2

Page 3: 0 - Guia Nº Recursividad

UNIVERSIDAD ANDINA DEL CUSCOFACULTAD DE INGENIERÍA

DEPARTAMENTO ACADEMICO DE INGENIERIA DE SISTEMASPROGRAMA ACADEMICO PROFESIONAL DE INGENIERÍA DE

SISTEMAS

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 Práctica:

1. Una de las funciones matemáticas recursivas más sencillas es la función factorial.

Datos Resultado0!1!2!3!4!5!6!

1126

24120720

0! = 11! = 1 2! = 2 * 1 =2 * 1! 3! = 3 * 2 * 1 =3 * 2!4! = 4 * 3 * 2 * 1 =4 * 3!5! = 5 * 4 * 3 * 2 * 1 =5 * 4!

n! = n*(n-1)! para n > 1 (caso recursivo)n! = 1 para n = 0 ó 1 (caso base)

using System;using System.Collections.Generic;using System.Text;namespace ConsoleApplication1{ class Program { static int factorialRecursivo(int n) {

Ing Cesar Medina Victorio

3

Page 4: 0 - Guia Nº Recursividad

UNIVERSIDAD ANDINA DEL CUSCOFACULTAD DE INGENIERÍA

DEPARTAMENTO ACADEMICO DE INGENIERIA DE SISTEMASPROGRAMA ACADEMICO PROFESIONAL DE INGENIERÍA DE

SISTEMAS

//-------------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.

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

Ing Cesar Medina Victorio

4

Page 5: 0 - Guia Nº Recursividad

UNIVERSIDAD ANDINA DEL CUSCOFACULTAD DE INGENIERÍA

DEPARTAMENTO ACADEMICO DE INGENIERIA DE SISTEMASPROGRAMA ACADEMICO PROFESIONAL DE INGENIERÍA DE

SISTEMAS

{ 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:

Diseña un procedimiento recursivo que escriba los números impares no primos. Diseña un procedimiento recursivo que escriba las cifras de un número N en orden inverso. Diseñar un procedimiento recursivo que saque las cifras de un número entero en su mismo orden; la

salida para 1051 debe ser 1, 0, 5, 1. Escriba una función recursiva para calcular el término n-ésimo de la secuencia de Lucas: 1, 3, 4, 7,

11, 18, 29, 47,...

Realizar un método recursivo que imprima en pantalla las cifras de un número dado, en orden inverso.

Investigación

1.- Multiplicación Rusa2.- Torres de Hanoi3.- Salto del Caballo4.- Ocho Reinas5.- Cuadrado Mágico

Ing Cesar Medina Victorio

5