Está en la página 1de 15

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 Naturaleza
Algoritmos
recursivos

Pila de recursion Caracteristicas

Tipos

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

2
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;
}

Tambin podemos abstraer las acciones de una cuenta bancaria


Clase CuentaBancaria
// atributos
Privado Entero Saldo;
Privado String NroCuenta;
Privado String Titular;
// mtodos
Accin CuentaBancaria(Entero montoInicial; String num, nombre)
// asigna a los atributo de la clase sus valores iniciales
Saldo = montoInicial;
NroCuenta = num;
Titular = nombre;
Faccin;
Pblico Accin depositar(Entero cantidad)
// incrementa el saldo de la cuenta
Saldo = Saldo + cantidad;
Faccin;
Pblico Accin retirar(Entero cantidad)
// disminuye el saldo de la cuenta
Saldo = Saldo - cantidad;
Faccin;
Pblico Funcin obtenerSaldo: Entero
// permite conocer el monto disponible o saldo de la cuenta
Retornar(saldo);
FFuncin;
FinClase CuentaBancaria

3
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

Encapsulamiento

El Encapsulamiento o encapsulacin es la propiedad que permite asegurar que el contenido de la i 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 es muy conveniente y nos permite (Si programamos bien) colocar en funcionamiento
nuestro objeto en cualquier tipo de sistema, de una manera modular y escalable (algunas de las reglas
de la ingeniera del software).
Formas de encapsular
Abierto(public): hace que el miembro de la clase pueda ser accedido desde el
exterior de
la Clase cualquier parte del programa.
Protegido(protected): solo es accesible desde la Clase y las clases que heredan (a
cualquier
nivel).
Cerrado (private): Solo es accesible desde la Clases

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.
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 instancia pblicos.
protected

protected void SoloSubClases(){}

4
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

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

5
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

Ejemplo

PROGRAMA

Programa Principal
datos

Mdulo1 Mdulo2
Datos + Datos1 Datos + Datos2

Proced1 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-
composicin).
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).

Ejemplo
Deposito Persona

DepositoFijo DepositoAhorr
o

La composicin, es un tipo de relacin esttica por valor, el tiempo de vida del objeto est condicionado
por el tiempo de vida del lo incluye, por ejemplo almacn est compuesto por cuentas, el objeto base se
construir a partir del objeto incluido. Es una relacin por tipo de valor, se representa por un rombo
relleno. Si se borra el objeto almacn tambin se borra el objeto cuenta.

Ejemplo

public class Cuenta


{private int num;
private int saldo;
}
public class Almacen {
private Cuenta cuenta;..}

6
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

La agregacin es una relacin por referencia, de tipo dinmica, el tipo de vida del objeto incluido es
independiente del que lo incluye. El objeto base utiliza al incluido para su funcionamiento. Si se borra el
objeto almacn sigue existiendo el objeto cliente.

Ejemplo:

public class Cliente{


private String nombre;.}
public class Almacen {
private String direccion;
public String mensaje(Cliente cliente){
return Cliente en mora+cliente.getNombre();}}

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);

7
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

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());
}
}

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

8
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

1 si N = 0 N = 1

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

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));
}

9
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

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.

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

10
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

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.
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) Solo se puede mover un disco por vez.


2) Solo se podr mover el disco que quede arriba en cualquiera de las tres varillas.
3) Un disco ms grande no se puede ubicar encima de uno mas pequeo.

11
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

------------------------------------- A------- B-------- C

/* 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 )
{
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.

12
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

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.

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

13
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

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);
}
}

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

14
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

ser tomado como un algoritmo de divide y vencers. El nombre decrementa y vencers ha sido
propuesta para la subclase simple de problemas.
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.

15

También podría gustarte