Está en la página 1de 15

Universidad Nacional de San Cristbal de Huamanga

IS241-Estructura de datos

Escuela de Formacin de Ingeniera de Sistemas Docente Ing. Elinar Carrillo Riveros

ao 2013

Universidad Nacional de San Cristbal de Huamanga

IS241-Estructura de datos

Semana 2
PRIMERA UNIDAD 1 Competencias Revisa los conceptos fundamentales de la programacin Conoce los elementos de la programacin para implantar estructuras. Interpreta la estructura de los datos segn su origen Aprende a combinar los elementos segn la teora de la programacin orientada a objetos. Valora los algoritmos para encontrar soluciones ptimas en la programacin

Contenido
Principios de la programacin orientada a objetos. Algoritmos recursivos: la naturaleza de la recursividad. Mtodos recursivos. Algoritmo divide y vencers .

Mapa Conceptual

Abstraccin Encapsulamiento Principios POO Modularidad Herencia Polimorfismo

Fundamentos de las estructuras de datos Definicin Algoritmos divide y vencieras Algoritmos recursivos Pila de recursion Tipos

Naturaleza

Caracteristicas

Escuela de Formacin de Ingeniera de Sistemas Docente Ing. Elinar Carrillo Riveros

ao 2013

Universidad Nacional de San Cristbal de Huamanga

IS241-Estructura de datos

FUNDAMENTOS DE LAS ESTRUCTURAS DE DATOS


6. Principios de la programacin orientada a objetos
Los principios de la programacin orientada a objetos segn Booch, son los siguientes:

Abstraccin. Encapsulamiento. Modularidad. Herencia. Polimorfismo.

Abstraccin
La abstraccin es uno de los medios ms importantes, mediante el cual nos enfrentamos con la complejidad inherente al software. La abstraccin es la propiedad que permite representar las caractersticas esenciales de un objeto, sin preocuparse de las restantes caractersticas (no esenciales). Abstraccin es la tcnica de quitarle a una idea o a un objeto todos los acompaamientos innecesarios hasta que los deja en una forma esencial y mnima. Una buena abstraccin elimina todos los detalles poco importantes y le permite enfocarse y concentrarse en los detalles importantes. Una abstraccin se centra en la vista externa de un objeto, de modo que sirva para separar el comportamiento esencial de un objeto de su implementacin. Definir una abstraccin significa describir una entidad del mundo real, no importa lo compleja que pueda ser y, a continuacin, utilizar esta descripcin en un programa. El elemento clave de la programacin orientada a objetos es la clase. Una clase se puede definir como una descripcin abstracta de un grupo de objetos, cada uno de los cuales se diferencia por su estado especfico y por la posibilidad de realizar una serie de operaciones. Por ejemplo, una pluma estilogrfica es un objeto que tiene un estado (llena de tinta o vaca) y sobre la cual se pueden realizar algunas operaciones (escribir, poner o quitar la tapa, llenar de tinta si est vaca, etc.). La idea de escribir programas definiendo una serie de abstracciones no es nueva, pero el uso de clases para gestionar dichas abstracciones en lenguajes de programacin ha facilitado considerablemente su aplicacin. La abstraccin es un principio de software importante. Una clase bien diseada expone un conjunto mnimo de mtodos cuidadosamente considerados que proporcionan el comportamiento esencial de una clase en una forma fcil de usar. Crear buenas abstracciones de software no es fcil. Encontrar buenas abstracciones generalmente requiere de un entendimiento muy claro del problema y de su contexto, gran claridad de pensamiento y amplia experiencia. Existe un principio muy importante relacionado con la abstraccin, y esta es, la Dependencia mnima. Las mejores abstracciones de software hacen que las cosas complejas sean simples. Logran esto al ocultar por completo los aspectos no esenciales de una clase. Estos aspectos no esenciales, una vez que han sido debidamente ocultados, no se pueden ver, ni usar, ni depender de ellos. Este principio de dependencia mnima es lo que hace que la abstraccin sea tan importante. El cambio es normal en el desarrollo de software. Lo mejor que puede hacer es minimizar el impacto de un cambio cuando ste sucede. Y cuanto menos dependa de algo, menos se ver afectado cuando cambie. Los lenguajes orientados a objetos proporcionan la Encapsulacin. La encapsulacin se puede utilizar para aplicar el concepto de Abstraccin.

Escuela de Formacin de Ingeniera de Sistemas Docente Ing. Elinar Carrillo Riveros

ao 2013

Universidad Nacional de San Cristbal de Huamanga

IS241-Estructura de datos

Ejemplo
Por ejemplo tienes un carro y quieres "abstraerlo" para hacer un programa en el que puedas realizar operaciones en base al carro. Puedes crear una clase con las caractersticas del carro por ejemplo. class carro { int cantidadDePuertas; int modelo; Color colorcito; String linea; public carro (int cantidadDePuertas, int modelo, Color colorcito, String linea){ this.cantidadDePuertas = cantidadDePuertas; this.modelo = modelo; this.colorcito = colorcito; this. linea = linea; } }

Encapsulamiento
El Encapsulamiento o encapsulacin es la propiedad que permite asegurar que el contenido de la informacin de un objeto est oculta al mundo exterior: el objeto A no conoce lo que hace el objeto B, y viceversa. La encapsulacin (tambin se conoce como ocultacin de la informacin), en esencia, es el proceso de ocultar todos los secretos de un objeto que no contribuyen a sus caractersticas esenciales. La encapsulacin permite la divisin de un programa en mdulos. Estos mdulos se implementan mediante clases, de forma que una clase representa la encapsulacin de una abstraccin. En la prctica, esto significa que cada clase debe tener dos partes: una interfaz y una implementacin. La interfaz de una clase captura slo su vista externa y la implementacin contiene la representacin de la abstraccin, as como los mecanismos que realizan el comportamiento adecuado. Encapsulacin es la capacidad de contener y controlar el acceso a un grupo de elementos asociados. Las clases proporcionan una de las formas ms comunes para encapsular elementos. En el siguiente ejemplo, la clase BankAccount encapsula los mtodos, campos y propiedades que se describen en una cuenta bancaria. Sin una encapsulacin, usted necesitara declarar procedimientos y variables por separado para almacenar y administrar informacin para la cuenta bancaria, y sera difcil trabajar con ms de una cuenta bancaria a la vez. La encapsulacin le permite utilizar los datos y procedimientos en la clase BankAccount como una unidad. Usted puede trabajar con varias cuentas bancarias al mismo tiempo sin confusin, debido a que cada cuenta est representada por una instancia nica de la clase. La encapsulacin tambin le permite controlar la forma en que se utilizan los datos y los procedimientos. Puede utilizar modificadores de acceso, como Private o Protected, para evitar que los procedimientos externos ejecuten mtodos de clase o lean y modifiquen datos en propiedades y campos. Usted debe declarar los detalles internos de una clase como Private para evitar que sean utilizados fuera de su clase; a esta tcnica se le llama ocultamiento de datos. En la clase BankAccount, la informacin del cliente, como el saldo de la cuenta, se protege de esta forma. Una de las reglas bsicas de la encapsulacin es que los datos de la clase slo se pueden modificar o recuperar a travs de los procedimientos o mtodos Property. Ocultar los detalles de implementacin de sus clases evita que se usen de maneras no deseadas, y le permite modificar esos elementos posteriormente sin riesgo de tener problemas de compatibilidad. Por ejemplo, versiones posteriores de la clase BankAccount enlistadas ms adelante, podran cambiar el tipo de datos del campo AccountBalance sin peligro de daar la aplicacin que depende de que este campo tenga un tipo de dato especfico.
Escuela de Formacin de Ingeniera de Sistemas Docente Ing. Elinar Carrillo Riveros

ao 2013

Universidad Nacional de San Cristbal de Huamanga

IS241-Estructura de datos

Ejemplo
Cuando se crea una nueva clase en Java, se puede especificar el nivel de acceso que se quiere para las variables de instancia y los mtodos definidos en la clase: public public void CualquieraPuedeAcceder(){} Cualquier clase desde cualquier lugar puede acceder a las variables y mtodos de instacia pblicos. protected protected void SoloSubClases(){} Slo las subclases de la clase y nadie ms puede acceder a las variables y mtodos de instancia protegidos. private private String NumeroDelCarnetDeIdentidad; Las variables y mtodos de instancia privados slo pueden ser accedidos desde dentro de la clase. No son accesibles desde las subclases. friendly (sin declaracin especfica) void MetodoDeMiPaquete(){} Por defecto, si no se especifica el control de acceso, las variables y mtodos de instancia se declaran friendly (amigas), lo que significa que son accesibles por todos los objetos dentro del mismo paquete, pero no por los externos al paquete. Es lo mismo que protected.

Modularidad :
La Modularidad es la propiedad que permite subdividir una aplicacin en partes ms pequeas (llamadas mdulos), cada una de las cuales debe ser tan independiente como sea posible de la aplicacin en s y de las restantes partes. La modularizacin consiste en dividir un programa en mdulos que se puedan compilar por separado, pero que tienen conexiones con otros mdulos. Al igual que la encapsulacin, los lenguajes soportan la Modularidad de diversas formas. La Modularidad es la propiedad de un sistema que permite su descomposicin en un conjunto de mdulos cohesivos y dbilmente acoplados. Por supuesto no todos los mdulos son iguales: tomar un programa monoltico y separarlo de forma aleatoria en archivos no es ptimo. Se debe tener en cuenta los conceptos asociados de dependencia, acoplamiento, cohesin, interfaz, encapsulacin y abstraccin. Una vez identificado lo que es un buen mdulo, se puede contemplar la reutilizacin de un buen mdulo como componente. El Mdulo A depende del Mdulo B si cualquier cambio en el Mdulo B implica que el Mdulo A tambin tenga que ser modificado. A veces se dice que el Mdulo A es un cliente del Mdulo B, o que el Mdulo B acta como servidor del Mdulo A. En general, es normal que un mismo mdulo sea tanto cliente como servidor. Esto significa, que depende de algunos mdulos, mientras que otros mdulos dependen de l. Incluso es posible que un par de mdulos se tengan uno al otro de cliente; sin embargo, ste es un ejemplo de dependencia circular, que debe evitarse cuando sea posible debido a que impide la reutilizacin. La dependencia a veces se conoce como acoplamiento. Un sistema con muchas dependencias tiene fuerte acoplamiento. Los buenos sistemas tienen dbil acoplamiento, porque en ese caso los cambios en una parte del sistema son menos probables de propagarse a travs del sistema.

Escuela de Formacin de Ingeniera de Sistemas Docente Ing. Elinar Carrillo Riveros

ao 2013

Universidad Nacional de San Cristbal de Huamanga

IS241-Estructura de datos

Los mdulos correctos a menudo tienen la propiedad de que sus interfaces proporcionan una abstraccin de algn elemento conocido de manera intuitiva que puede, no obstante, ser difcil de implementar. Este tipo de mdulos se dice que tienen una fuerte cohesin. El mdulo realiza un conjunto coherente de cosas, pero dentro de lo posible el desarrollador del cliente est protegido de la informacin irrelevante relativa a cmo el mdulo hace lo que hace. Resumiendo: Abstraccin es cuando un cliente de un mdulo no necesita saber ms de lo que hay en la interfaz. Encapsulacin es cuando un cliente de un mdulo no es capaz de saber ms de lo que hay en la interfaz. Si un mdulo, de cualquier tamao y complejidad, es una buena abstraccin (tiene fuerte cohesin y dbil acoplamiento) puede ser factible reutilizarlo en sistemas posteriores, o sustituirlo en el sistema existente.

Ejemplo

PROGRAMA

Programa Principal datos

Mdulo1 Datos + Datos1 Proced1

Mdulo2 Datos + Datos2 Proced2 Proced3

Jerarqua o Herencia
La Jerarqua es una propiedad que permite la ordenacin de las abstracciones. Las dos jerarquas ms importantes de un sistema complejo son: estructura de clases (jerarqua es-un (is-a): generalizacin/especializacin) y estructura de objetos (jerarqua parte-de (part-of): agregacin). Las jerarquas de generalizacin/especializacin se conocen como herencia. Bsicamente, la herencia define una relacin entre clases, en donde una clase comparte la estructura o comportamiento definido en una o ms clases (herencia simple y herencia mltiple, respectivamente). La agregacin es el concepto que permite el agrupamiento fsico de estructuras relacionadas lgicamente. As, un camin se compone de ruedas, motor, sistema de transmisin y chasis; en consecuencia, camin es una agregacin, y ruedas, motor, transmisin y chasis son agregados de camin.

Ejemplo

Deposito

Persona

DepositoFijo
Escuela de Formacin de Ingeniera de Sistemas Docente Ing. Elinar Carrillo Riveros

DepositoAhorr o
ao 2013

Universidad Nacional de San Cristbal de Huamanga

IS241-Estructura de datos

Polimorfismo
La quinta propiedad significativa de los lenguajes de programacin orientados a objetos es el polimorfismo. Es la propiedad que indica, literalmente, la posibilidad de que una entidad tome muchas formas. En trminos prcticos, el polimorfismo permite referirse a objetos de clases diferentes mediante el mismo elemento de programa y realizar la misma operacin de diferentes formas, segn sea el objeto que se referencia en ese momento. Por ejemplo, cuando se describe la clase mamferos se puede observar que la operacin comer es una operacin fundamental en la vida de los mamferos, de modo que cada tipo de mamfero debe poder realizar la operacin o funcin comer. Por otra parte, una cabra o una vaca que pastan en un campo, un nio que se come un caramelo y un len que devora a otro animal, son diferentes formas que utilizan diferentes mamferos para realizar la misma funcin (comer). El polimorfismo adquiere su mxima expresin en la derivacin o extensin de clases, es decir, cuando se obtiene una clase a partir de una clase ya existente, mediante la propiedad de derivacin de clases o herencia. El polimorfismo requiere ligadura tarda o postergada (tambin llamada dinmica), y esto slo se puede producir en lenguajes de programacin orientados a objetos. Los lenguajes no orientados a objetos soportan ligadura temprana o anterior (tambin llamada esttica), esto significa que el compilador genera una llamada a un nombre especfico de funcin y el enlazador ( linker) resuelve la llamada a la direccin absoluta del cdigo que se ha de ejecutar. En POO, el programa no puede determinar la direccin del cdigo hasta el momento de la ejecucin. Cuando se enva un mensaje a un objeto, el cdigo que se llama no se determina hasta el momento de la ejecucin. El compilador asegura que la funcin existe y realiza verificacin de tipos de los argumentos y del valor de retorno, pero no conoce el cdigo exacto a ejecutar.

Ejemplo
package com.practica.polimorfismo; import java.util.ArrayList; import java.util.List; public class CalcularOperacionesFigura { public static void main(String[] args) { OperacionesFigura of = new Triangulo(Triangulo, Azul, 15.0, 3.0); OperacionesFigura of2 = new Circulo(Circulo, Verde, 12.3); List<OperacionesFigura> lista = new ArrayList<OperacionesFigura>(); lista.add(of); lista.add(of2); calcularArea(lista); } public static void calcularArea(List<OperacionesFigura> listaOperacionesFiguras) { for (OperacionesFigura of : listaOperacionesFiguras) { System.out.println(Area es: + of.calcularArea()); System.out.println(Nombre es: + of.figura().getNombre()); System.out.println(Color es: + of.figura().getColor());

Escuela de Formacin de Ingeniera de Sistemas Docente Ing. Elinar Carrillo Riveros

ao 2013

Universidad Nacional de San Cristbal de Huamanga

IS241-Estructura de datos

} } }

7. Algoritmos recursivos
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, en contraposicin a los algoritmos iterativos, que hacen uso de bucles while, do-while, for, etc. 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. Ejemplo: definicin de n natural: - el N 0 es natural - El N n es natural si n-1 lo es. Un mtodo recursivo es un mtodo que se llama a si mismo, directa o indirectamente. Es una alternativa a la iteracin o repeticin. En cuanto a tiempo de computadora y uso de memoria es menos eficiente, es una herramienta til para solucionar problemas de naturaleza recursiva.

Naturaleza de la recursividad
Un objeto es recursivo si figura en su propia definicin Ejemplo: 1 para N = 0

1) N! =
N(N-1)! para N > 0

si N = 0 N = 1

2) fibonacci(N) = fibonacci(N-1)+ fibonacci(N-2) si N > 1

Escuela de Formacin de Ingeniera de Sistemas Docente Ing. Elinar Carrillo Riveros

ao 2013

Universidad Nacional de San Cristbal de Huamanga

IS241-Estructura de datos

Caracterstica de la recursividad Siempre existe una forma de salir de la definicin.


En un algoritmo recursivo distinguimos como mnimo 2 partes: a). Caso trivial, base o de fin de recursin: Una condicin de salida que es la condicin que no produce otra autollamada. 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: Una llamada a s mismo (recursiva); normalmente con el valor de los parmetros que cambian en cada llamada. 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: int factorial( int n ) { int res=1; for(int i=1; i<=n; i++ ) res = res*i; return(res); } RECURSIVO: int factorial( int n ) { if(n==0) return(1); return(n*Factorial(n-1)); }

TIPOS DE RECURSIN
Recursividad directa O recursividad simple es 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 difcil de hacer de forma iterativa.

Escuela de Formacin de Ingeniera de Sistemas Docente Ing. Elinar Carrillo Riveros

ao 2013

Universidad Nacional de San Cristbal de Huamanga

IS241-Estructura de datos

int fib( int n ) /* ej: Fibonacci */ { if(n <= 1) return 1; return(fib(n-1) + fib(n-2)); }

Recursividad anidada: En algunos de los argumentos 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 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));}

LA PILA DE RECURSIN
La memoria del ordenador se divide (de manera lgica, no fsica) en varios segmentos (4): Segmento de cdigo: Parte de la memoria donde se guardan las instrucciones del programa en cdigo de mquina. Segmento de datos: Parte de la memoria destinada a almacenar las variables estticas. Montculo: Parte de la memoria destinada a las variables dinmicas. Pila del programa: Parte destinada a las variables locales y parmetros de la funcin que est siendo ejecutada.

Llamada a una funcin:


Se reserva espacio en la pila para los parmetros de la funcin y sus variables locales. Se guarda en la pila la direccin de la lnea de cdigo desde donde se ha llamado a la funcin.
Escuela de Formacin de Ingeniera de Sistemas Docente Ing. Elinar Carrillo Riveros

ao 2013

Universidad Nacional de San Cristbal de Huamanga

IS241-Estructura de datos

Se almacenan los parmetros de la funcin y sus valores en la pila. Al terminar la funcin, se libera la memoria asignada en la pila y se vuelve a la instruccin actual.

Llamada a una funcin recursiva:


En el caso recursivo, cada llamada genera un nuevo ejemplar de la funcin con sus correspondientes objetos locales: La funcin se ejecutar normalmente hasta la llamada a s misma. En ese momento se crean en la pila nuevos parmetros y variables locales. El nuevo ejemplar de funcin comienza a ejecutarse. Se crean ms copias hasta llegar a los casos bases, donde se resuelve directamente el valor, y se va saliendo liberando memoria hasta llegar a la primera llamada (ltima en cerrarse)

Medicin de la eficacia de un algoritmo recursivo Viene dada por: 1. Tiempo de ejecucin 2. Espacio de memoria ocupado por el algoritmo 3. Legibilidad y facilidad de comprensin

EJERCICIOS
a). Torres de Hanoi: Problema de solucin recursiva, consiste en mover todos los discos (de diferentes tamaos) de una aguja a otra, usando una aguja auxiliar, y sabiendo que un disco no puede estar sobre otro menor que ste. Este es un problema matemtico bastante conocido para estudiantes de Ingeniera de sistemas, ciencias computacionales, algoritmia, programacin, matemtica entre otros. En el problema se encuentran tres varillas puestas verticalmente, y en una de ellas se encuentran un numero determinado de discos ordenados de mayor a menor de forma ascendente, el nmero de discos depende de la complejidad del problema. Para solucionar dicho ejercicio se deben pasar todos los discos de una varilla a otra, de forma que queden ordenados igual que al comienzo (de mayor a menor de manera ascendente) pero esto respetando algunas reglas: 1) 2) 3) Solo se puede mover un disco por vez. Solo se podr mover el disco que quede arriba en cualquiera de las tres varillas. Un disco ms grande no se puede ubicar encima de uno mas pequeo.

------------------------------------- A------/* Solucion: 1- Mover n-1 discos de A a B 2- Mover 1 disco de A a C 3- Mover n-1 discos de B a C */ void Hanoi( n, inicial, aux, final )

B-------- C

Escuela de Formacin de Ingeniera de Sistemas Docente Ing. Elinar Carrillo Riveros

ao 2013

Universidad Nacional de San Cristbal de Huamanga

IS241-Estructura de datos

{ if( n>0 ) { Hanoi(n-1, inicial, final, aux ); printf("Mover %d de %c a %c", n, inicial, final ); Hanoi(n-1, aux, inicial, final ); } }

b). Calcular x elevado a n de forma recursiva:

float xelevn( float base, int exp ) { if(exp == 0 ) return(1); return( base*xelevn(base,exp-1)); }

c). Multiplicar 2 ns con sumas sucesivas recursos:

int multi( int a, int b ) { if(b == 0 ) return(0); return( a + multi(a, b-1)); }

METODOS RECURSISVOS Primero debemos decir que la recursividad no es una estructura de datos, sino que es una tcnica de programacin que nos permite que un bloque de instrucciones se ejecute n veces. Remplaza en ocasiones a estructuras repetitivas. Este concepto ser de gran utilidad para el captulo de la estructura de datos tipo rbol. La recursividad es un concepto difcil de entender en principio, pero luego de analizar diferentes problemas aparecen puntos comunes. En Java los mtodos pueden llamarse a s mismos. Si dentro de un mtodo existe la llamada a s mismo decimos que el mtodo es recursivo. Cuando un mtodo se llama a s mismo, se asigna espacio en la pila para las nuevas variables locales y parmetros. Al volver de una llamada recursiva, se recuperan de la pila las variables locales y los parmetros antiguos y la ejecucin se reanuda en el punto de la llamada al mtodo.
Escuela de Formacin de Ingeniera de Sistemas Docente Ing. Elinar Carrillo Riveros

ao 2013

Universidad Nacional de San Cristbal de Huamanga

IS241-Estructura de datos

Problema1 Implementacin de un mtodo recursivo.

Programa:
public class Recursividad { void repetir() { repetir(); } public static void main(String[] ar) { Recursividad re=new Recursividad(); re.repetir(); } }

La funcin repetir es recursiva porque dentro de la funcin se llama a s misma. Cuando ejecuta este programa se bloquear y generar una excepcin: "Exception in thread "main" java.lang.StackOverflowError" Analicemos como funciona: Primero se ejecuta la funcin main, luego de crear un objeto llamamos a la funcin repetir. Hay que tener en cuenta que cada vez que se llama a una funcin se reservan 4 bytes de la memoria que se liberarn cuando finalice su ejecucin. La primera lnea de la funcin llama a la funcin repetir, es decir que se reservan 4 bytes nuevamente. Se ejecuta nuevamente una instancia de la funcin repetir y as sucesivamente hasta que la pila esttica se colme y se cuelgue el programa.

Problema 2:
Implementacin de un mtodo recursivo que reciba un parmetro de tipo entero y luego llame en forma recursiva con el valor del parmetro menos 1.

Programa
public class Recursividad { void imprimir(int x) { System.out.println(x); imprimir(x-1); } public static void main(String[] ar) { Recursividad re=new Recursividad(); re.imprimir(5); } }

Escuela de Formacin de Ingeniera de Sistemas Docente Ing. Elinar Carrillo Riveros

ao 2013

Universidad Nacional de San Cristbal de Huamanga

IS241-Estructura de datos

Desde la main se llama a la funcin imprimir y se le enva el valor 5. El parmetro x recibe el valor 5. Se ejecuta el algoritmo de la funcin, imprime el contenido del parmetro (5) y seguidamente se llama a una funcin, en este caso a s misma (por eso decimos que es una funcin recursiva), envindole el valor 4. El parmetro x recibe el valor 4 y se imprime en pantalla el cuatro, llamando nuevamente a la funcin imprimir envindole el valor 3. Si continuamos este algoritmo podremos observar que en pantalla se imprime: 5 4 3 2 1 0 ?1 ?2 ?3 . . . . . . . . . hasta que se bloquee el programa. Tener en cuenta que cada llamada a una funcin consume 4 bytes por la llamada y en este caso 4 bytes por el parmetro x. Como nunca finaliza la ejecucin completa de las funciones se desborda la pila esttica por las sucesivas llamadas. 8. ALGORITMO DIVIDE Y VENCERS En la cultura popular, divide y vencers hace referencia a un refrn que implica resolver un problema difcil, dividindolo en partes ms simples tantas veces como sea necesario, hasta que la resolucin de las partes se torna obvia. La solucin del problema principal se construye con las soluciones encontradas. En las ciencias de la computacin, el trmino divide y vencers (DYV) hace referencia a uno de los ms importantes paradigmas de diseo algortmico. El mtodo est basado en la resolucin recursiva de un problema dividindolo en dos o ms subproblemas de igual tipo o similar. El proceso contina hasta que stos llegan a ser lo suficientemente sencillos como para que se resuelvan directamente. Al final, las soluciones a cada uno de los subproblemas se combinan para dar una solucin al problema original. Esta tcnica es la base de los algoritmos eficientes para casi cualquier tipo de problema como, por ejemplo, algoritmos de ordenamiento (quicksort, mergesort, entre muchos otros), multiplicar nmeros grandes (Karatsuba), anlisis sintcticos (anlisis sintctico top-down) y la transformada discreta de Fourier. Por otra parte, analizar y disear algoritmos de DyV son tareas que lleva tiempo dominar. Al igual que en la induccin, a veces es necesario sustituir el problema original por uno ms complejo para conseguir realizar la recursin, y no hay un mtodo sistemtico de generalizacin. El nombre divide y vencers tambin se aplica a veces a algoritmos que reducen cada problema a un nico subproblema, como la bsqueda binaria para encontrar un elemento en una lista ordenada (o su equivalente en computacin numrica, el algoritmo de biseccin para bsqueda de races). Estos algoritmos pueden ser implementados ms eficientemente que los algoritmos generales de divide y vencers; en particular, si es usando una serie de recursiones que lo convierten en simples bucles. Bajo esta amplia definicin, sin embargo, cada algoritmo que usa recursin o bucles puede ser tomado como un algoritmo de divide y vencers. El nombre decrementa y vencers ha sido propuesta para la subclase simple de problemas.

Escuela de Formacin de Ingeniera de Sistemas Docente Ing. Elinar Carrillo Riveros

ao 2013

Universidad Nacional de San Cristbal de Huamanga

IS241-Estructura de datos

La correccin de un algoritmo de divide y vencers, est habitualmente probada una induccin matemtica, y su coste computacional se determina resolviendo relaciones de recurrencia.

Escuela de Formacin de Ingeniera de Sistemas Docente Ing. Elinar Carrillo Riveros

ao 2013

También podría gustarte