Está en la página 1de 47

RECURSIVIDAD

Pgina 1

INSTITUTO

TECNOLOGICO DE TAPACHULA
CATEDRTICO: ING. ROSEL MUOS LPEZ

MATERIA:
RECURSIVIDAD Pgina 2

ESTRUCTURA DE DATOS UNIDAD II.- RECURSIVIDAD ALUMNOS: EMMANUEL DE JESUS ROBLES GONZALEZ EDUARDO BARTOLON ORTIZ EDI ALBERTO MORALES CRUZ CARRERA: ING. SISTEMAS COMPUTACIONALES

TAPACHULA DE CORDOBA Y ORDOEZ

A 10 DE SEPTIEMBRE DE 2011.

INDICE
Contenido
INTRODUCCION:

RECURSIVIDAD

Pgina 3

Presionar tecla Ctrl + click sobre el tema que desea ver.

INTRODUCCIN
El rea de la programacin es muy amplia y con muchos detalles. Los programadores necesitan ser capaces de resolver todos los problemas que se les presente a travs del computador aun cuando en el lenguaje que utilizan no haya una manera directa de resolver los problemas. En el lenguaje de programacin Java, as como en otros lenguajes de programacin, se puede aplicar una tcnica que se le dio el nombre de recursividad por su funcionalidad. Esta tcnica es utilizada en la programacin estructurada para resolver problemas que tengan que ver con el factorial de un nmero, o juegos de lgica. Las asignaciones de memoria pueden ser dinmicas o estticas y hay diferencias entre estas dos y se pueden aplicar las dos en un programa cualquiera. El mtodo recursivo es un mtodo que se llama as mismo directa o indirectamente. Existen dos clases de recursividad que son: recursin directa que es el proceso de por el que un mtodo se llama as mismo desde el propio cuerpo del mtodo, y la recursin indirecta implica ms d un mtodo. La recursividad indirecta implica que la existencia de dos mtodos: uno() y dos (). Entonces desde el main () llama a uno (), y a continuacin uno () llama a dos (). En alguna parte del proceso dos () llama a uno (), una segunda llamada a uno (). Esta accin es recursin indirecta, por eso es recursiva, ya que uno () ha sido llamado dos veces, sin retornar nunca a su llamadora.

RECURSIVIDAD

Pgina 4

EJEMPLO SIMILAR DE LO QUE ES LA RECURSIVIDAD:


La Matrushka es una artesana tradicional rusa. Es una mueca de madera que contiene otra mueca ms pequea dentro de s. Esta mueca, tambin contiene otra mueca dentro. Y as, una dentro de otra.

RECURSIVIDA DEFINICION:

RECURSIVIDAD

Pgina 5

Es una alternativa diferente para implementar estructuras de repeticin (ciclos). Los mdulos se hacen llamadas recursivas. Se puede usar en toda situacin en la cual la solucin pueda ser expresada como una secuencia de movimientos, pasos o transformaciones gobernadas por un conjunto de reglas no ambiguas. Un mtodo recursivo es aquel que se llama a s mismo, bien directamente o bien a travs de otro mtodo. La recursividad es un concepto fundamental en matemticas y en computacin. Recursividad es una tcnica de programacin importante. Se utiliza para realizar una llamada a una funcin desde la misma funcin. Recursividad y la iteracin (ejecucin en bucle) estn muy relacionadas, cualquier accin que pueda realizarse con la recursividad puede realizarse con iteracin y viceversa. La recursin en los subprogramas puede darse de dos maneras diferentes:
a) Directa: el subprograma se llama directamente a s mismo. Por ejemplo, un

subprograma y en alguna parte de el aparece una llamada a s mismo.

b) Indirecta: el subprograma llama a otro subprograma, y este a su vez llama

al primero. Por ejemplo, el subprograma P llama al subprograma Q y este a su vez invoca al primero (fig. 1). Tambin se da la recursin indirecta cuando el subprograma llama a otro y este a un tercero. Una vez ejecutado, el control regresa al subprograma que lo llamo; lo mismo sucede en todos sus niveles. Por ejemplo, el subprograma P que llama al subprograma Q, y este llama al subprograma

RECURSIVIDAD

Pgina 6

V. Cuando V concluye, el control regresa a Q, y al terminar este, el control se transfiere a P (fig.2)

RECURSIVIDAD

Pgina 7

Es fcil crear una funcin recursiva que no llegue a devolver nunca un resultado definitivo y no pueda llegar a un punto de finalizacin. Este tipo de recursividad hace que el sistema ejecute lo que se conoce como bucle "infinito".
public class Recurividad // se declara la clase { static int mtodo(int a) // este es un mtodo recursivo donde su parmetro a adquiere el valor de x. { a++; // se incrementa la variable a. return mtodo(a); // este es el llamado al mtodo as mismo donde no tiene fin } public static void main(string arg []) // este es el metodo main donde java ejecuta los programas { int x; // declaracion de una variable local x del mtodo main. x=Integer.parseInt(JOptionPane.showInputDialog(null,introduaca numero)); // pedimos el valor de x. metodo(x); // se manda a llamar al mtodo statico. } }

RECURSIVIDAD

Pgina 8

Los parmetros y variables locales toman nuevos valores en cada llamada (no se trabaja con los anteriores). Un procedimiento o funcin se dice recursivo si durante su ejecucin se invoca directa o indirectamente a s mismo. Esta invocacin depende al menos de una condicin que acta como condicin de corte que provoca la finalizacin de la recursin. Un algoritmo recursivo consta de: 1- Al menos un caso trivial o base, es decir, que no vuelva a invocarse y que se ejecuta cuando se cumple cierta condicin, y 2- el caso general que es el que vuelve a invocar al algoritmo con un caso ms pequeo del mismo.

public class Recurividad // se declara la clase { static int mtodo(int a) // este es un mtodo recursivo donde su parmetro a adquiere el valor de x. { If(a==0) // este es una sentencia de control para finalizar la recursividad { a--; // se le resta 1 al valor de la variable a . // a este se le denomina caso base por qu no se vuelve a invocar al mismo mtodo. } Else { return mtodo(a); // este es el llamado al mtodo as mismo donde no tiene fin // Tambin se le denomina caso GENERAL por que se llama as mismo } } public static void main(string arg []) // metodo main donde java ejecuta los programas { int x; // declaracion de una variable local x del mtodo main. x=Integer.parseInt(JOptionPane.showInputDialog(null,introduaca numero)); // pedimos el valor de x. metodo(x); // se manda a llamar al mtodo statico. } }

RECURSIVIDAD

Pgina 9

TIPOS DE RECURSIVIDAD SEGN SU COMPLEJIDAD


1. Recursin lineal: Un mtodo recursivo es lineal, si como mximo tiene una

llamada recursiva por rama del condicional, de manera que la cantidad de llamadas recursivas puede calcularse como una funcin lineal que depender de la velocidad con la cual progresa hacia el caso base. sta a su vez la subdividimos en:
1. Recursin por la cola: es cuando la llamada recursiva se hace al final

del mtodo, no quedan operaciones pendientes sobre los datos, de manera que no hace falta representar con una pila las variables de cada llamada, y el mtodo recursivo lo podramos transformar tranquilamente en un bucle iterativo.
2. Recursin no por la cola: es cuando despus de ejecutar todas las

llamadas recursivas el mtodo debe realizar una operacin pendiente para completar el proceso.
2. Recursin no lineal: Un mtodo recursivo es no lineal, si hay ms de una

llamada recursiva por rama del condicional.


1. Recursin en cascada: es cuando en cada rama hay ms de una

llamada a la funcin recursiva, su complejidad en trmino de llamadas recursivas ser una funcin exponencial de la profundidad del rbol de las llamadas.
2. Recursin anidada: es cuando alguna llamada recursiva recibe como

parmetro a una llamada recursiva, su complejidad en trmino de llamadas recursivas resultar mucho ms difcil de calcular.

3. Recursin mutua: se da cuando dos funciones son recurrentes entre s.

FUNCIN RECURSIVA
Las funciones recursivas se componen de:

RECURSIVIDAD

Pgina 10

Caso base: una solucin simple para un caso particular (puede haber ms

de un caso base). La secuenciacin, iteracin condicional y seleccin son estructuras vlidas de control que pueden ser consideradas como enunciados. NOTA: Regla recursiva Las estructuras de control que se pueden formar combinando de manera vlida la secuenciacin, iteracin condicional y seleccin tambin son vlidos.
Caso recursivo: una solucin que involucra volver a utilizar la funcin

original, con parmetros que se acercan ms al caso base. Los pasos que sigue el caso recursivo son los siguientes:
1. El procedimiento se llama a s mismo. 2. El problema se resuelve, resolviendo el mismo problema pero de

tamao menor. 3. La manera en la cual el tamao del problema disminuye asegura que el caso base eventualmente se alcanzar.

ASIGNACION ESTATICA Y DINAMICA DE LA MEMORIA


Uso de la memoria en Tiempo de ejecucin.

RECURSIVIDAD

Pgina 11

Al ejecutar una aplicacin Java, la memoria usada por la aplicacin se divide en distintas zonas:

Fig. 3 Esquema en el que se divide la memoria en un programa recursivo. Programas: En una zona de memoria se cargan los bytecodes correspondientes a las clases que forman parte de la aplicacin. Zona esttica. Donde se almacenan las variables de clase (declaradas con static) Datos compartidos (datos globales). Datos que han de mantenerse ms all de la duracin de la invocacin de un mtodo o de la vida de un objeto. Pila. Es una coleccin lineal, dinmica y homognea, en la que los elementos se insertan y se extraen por el mismo extremo. Tambin conocida como estructura LIFO (Last In, First Out). Operaciones:

Crear pila Meter Sacar Destruir pila Estar vaca

RECURSIVIDAD

Pgina 12

CMO FUNCIONAN LOS ALGORITMOS RECURSIVOS


Para entender cmo funciona la recursividad es necesario que tengamos presente las reglas y los tipos de pasaje de parmetros provistos en JAVA.
Se descompone el problema en problemas de menor complejidad (algunos

de ellos de la misma naturaleza que el problema original).


Se resuelve el problema para, al menos, un caso base. Se compone la solucin final a partir de las soluciones parciales que se van

obteniendo.

Ejemplo

RECURSIVIDAD

Pgina 13

static int potencia (int x, int n) { if(n==0) // Caso base return 1; else // Caso general return x * potencia(x, n-1); }

Proceso del programa para calcular la potencia de 53.

DISEO DE ALGORITMOS RECURSIVOS


1.- Resolucin de problemas para los casos base:

Sin emplear recursividad. Siempre debe existir algn caso base.

2.- Solucin para el caso general:

Expresin de forma recursiva. Puede incluirse pasos adicionales (para combinar las soluciones parciales).

RECURSIVIDAD

Pgina 14

Siempre se debe avanzar hacia un caso base: Las llamadas recursivas simplifican el problema y, en ltima instancia, los casos base nos sirven para obtener la solucin.

Los casos base corresponden a situaciones que se pueden resolver con facilidad. Los dems casos se resuelven recurriendo, antes o despus, a alguno(s) de los casos base.

De esta forma, podemos resolver problemas complejos que seran muy difciles de resolver directamente.

PROPIEDADES DE ALGORITMOS RECURSIVOS:

Un requisito importante para que sea correcto un algoritmo recursivo es que no genere una secuencia infinita de llamadas as mismo. Claro que cualquier algoritmo que genere tal secuencia no termina nunca. Una funcin f se debe llamar as mismo y no debe de contener ningn bucle repetitivo (while, do while o for). Una funcin recursiva f debe definirse en trminos que no impliquen a f al menos en un argumento o grupo de argumentos. Debe existir una salida de la secuencia de llamadas recursivas. Si en esta salida no puede calcularse ninguna funcin recursiva. Cualquier caso de definicin recursiva o invocacin de un algoritmo recursivo tiene que reducirse a la larga a alguna manipulacin de uno o casos ms simples no recursivos.

La recursividad es una tcnica de programacin importante. Se utiliza para realizar una llamada a una funcin desde la misma funcin. Como ejemplo til se puede presentar el clculo de nmeros factoriales. l factorial de 0 es, por definicin, 1. Los factoriales de nmeros mayores se calculan mediante la multiplicacin de 1 * 2 *..., incrementando el nmero de 1 en 1 hasta llegar al nmero para el que se est calculando el factorial.

EJEMPLO PROGRAMA QUE CALCULA EL FACTORIAL.

RECURSIVIDAD

Pgina 15

PSEUDOCDIGO FACTORIAL
Inicio Variables N,Fact,aux. Imprimir "Introduce el nmero: " Leer N aux= n-1. fact=n Hacer fact=fact * aux. Hasta que aux=1 Imprimir "El factorial de ", n, "es:", fact Fin.

RECURSIVIDAD

Pgina 16

Factorial calculado de forma recursiva: Static int factorial (int n) { Int resultado; if (n==0) // Caso base resultado=1; else // Caso general resultado=n*factorial(n-1); return resultado; }

EJEMPLO FACTORIAL DEL NUMERO 4

Prueba de escritorio y cdigo.

RECURSIVIDAD

Pgina 17

Esta es la definicin recursiva de la funcin factorial, ya que se define en trminos de s misma. La primera regla de la definicin, o caso base, establece la condicin de terminacin. Las definiciones recursivas nos permiten definir un conjunto infinito de objetos mediante una sentencia finita.

EJEMPLO DE RECURSIVIDAD DE LA SERIE FIBONACCI


SERIE FIBONACCI 1, 1, 2, 3, 5, 8, 13, 21, 34, . . . . . .N

Qu relacin tiene la serie fibonacci?


Esta serie tiene como relacin la suma de 2 nmeros, la cual comienza con una suma simple de c=a+b(1+0=1) despus se toma el elemento b (0) y se suma con el resultado (1) y as sucesivamente, ejemplo:
RECURSIVIDAD Pgina 18

Una sucesin de Fibonacci es aquella cuya ley de recurrencia es: an = an-1 + an-2 Es decir, cada trmino de la sucesin se obtiene sumando los dos anteriores. Para empezar a construirla necesitamos, por tanto, dos nmeros de partida, a1 y a2. De esta forma, a3 sera a2 + a1 ; a4 sera a3 + a2 y as sucesivamente. La ms conocida es la que tiene a1 = 1 y a2 = 1, cuyos trminos son: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 ... Nmeros cuales todos son los que son conocidos como Nmeros de Fibonacci. Los trminos de cualquier sucesin de Fibonacci tienen la particularidad de que el cociente entre dos trminos consecutivos se aproxima al Nmero de Oro (1.6180339887499...), es decir, el lmite de los cocientes an+1/an tiende al Nmero de Oro cuando n tiende a infinito.

Frmula recursiva fibonacci(n) = fibonacci (n - 1) + fibonacci (n - 2) Caso base: Fib (0)=0; Fib (1)=1 Caso recursivo: Fib (i) = Fib (i -1) + Fib(i -2) public static int fib(int n) { if (n <= 1)
RECURSIVIDAD Pgina 19

return n; else

//condicin base //condicin recursiva

return fib(n-1)+fib(n-2); }

RECURSIVIDAD

Pgina 20

Y nos muestra en pantalla:

CADENAS RECURSIVAS O RECURSIVIDAD INDIRECTA


Una funcin recursiva no necesita llamarse a s misma de manera directa. En su lugar, puede hacerlo de manera indirecta. Pueden incluirse ms de dos rutinas en una cadena recursiva. As, una rutina a puede llamar a b, que llama a c, ..., que llama a z, que llama a a. Cada rutina de la cadena puede potencialmente llamarse a s misma y, por lo tanto es recursiva. Por supuesto, el programador debe asegurarse de que un programa de este tipo no genere una secuencia infinita de llamadas recursivas. Son algoritmos donde una funcin provoca una llamada a s misma de forma indirecta, a travs de otras funciones. Una funcin recursiva no necesita llamarse a s misma de manera directa. En su lugar, puede hacerlo de manera indirecta como en el siguiente ejemplo:

RECURSIVIDAD

Pgina 21

a (formal parameters) { . b (arguments); . } /*fin de a*/ {

b (formal parameters)

. a (arguments); . } /*fin de b*/

La recursividad indirecta es aquella que se llama asi mismo pero tambin puede llamar a otro mtodo recursivo dentro del primero mtodo, como en el ejemplo anterior el mtodo a llama el mtodo b dentro de su estructura y el mtodo b llama al mtodo a tambin dentro de su estructura. Claro que un mtodo recursivo tambin tienen que ser finito. Conclusin:
Cuando un procedimiento incluye una llamada a s mismo se conoce como

recursin directa.
Cuando un procedimiento llama a otro procedimiento y ste causa que el

procedimiento original sea invocado, se conoce como recursin indirecta. NOTA: Cuando un procedimiento recursivo se llama recursivamente a si mismo varias veces, para cada llamada se crean copias independientes de las variables declaradas en el procedimiento.

Un ejemplo de recursividad indirecta es el de calcular si un nmero es primo o no. public class Primo
RECURSIVIDAD Pgina 22

{ static int z=1; static int pri(int q) { z++; if(z<x) return sec(q); else return 0; } static int sec(int y) { if(y%z==0) return 1; else return pri(y); } public static void main(String arg[]) { int x; x=Integer.parseInt(JOptionPane.showInputDialog(null,"Introdusca Numero")); if(pri(x)==0) JOptionPane.showMessageDialog(null,"El Numero ES Primo"); else JOptionPane.showMessageDialog(null,"El Numero NO es Primo"); } } En el cdigo anterior la clase primo est constituida por dos mtodos recursivos los cuales son pri(int q) con parameto entero q y el segundo es sec(int y) con parmetro y, que al momento de ejecutarlo, en el main se crea una variable local x la cual nos pide un valor, despus de asignarle un valor entero a x entrasmos una condicin en la cuan dentro de la condicin mandamos a llamar al primero mtodo (pri(x)) el cual le pasamos el valor de x y q lo recibe y dentro del primer mtodo hay otra condicin si es verdadera manda a llamar al segundo mtodo (sec(q)) al cual le pasamos el valor de q y dentro del segundo mtodo madamos a llamar el primer mtodo y asi sucesivamente hasta que la recursividad llegue a su fin y nos devuelva un valor.

PROBLEMA DE LAS TORRES DE HANI:


Este problema es uno de los ejemplos clsicos de recursividad.

RECURSIVIDAD

Pgina 23

Tenemos tres astas A, B y C, y un conjunto de cinco aros, todos de distintos

tamaos.
El enigma comienza con todos los aros colocados en el asta A de tal forma

que ninguno de ellos debe estar sobre uno ms pequeo a l; es decir, estn apilados, uno sobre el otro, con el ms grande hasta abajo, encima de l, el siguiente en tamao y as sucesivamente.

El propsito del enigma es lograr apilar los cincos aros, en el mismo orden,

pero en el hasta C.

Una restriccin es que durante el proceso, puedes colocar los aros en

cualquier asta, pero debe apegarse a las siguientes reglas:


Solo puede mover el aro superior de cualquiera de las astas. Un aro ms grande nunca puede estar encima de uno ms pequeo.

RECURSIVIDAD

Pgina 24

CMO RESOLVEMOS EL PROBLEMA? Para encontrar cmo se resolvera este problema, debemos ir viendo cmo se resolvera cada caso.

CMO SE RESOLVERA EL CASO EN QUE HUBIERA UN ARO?

PASANDO DIRECTAMENTE EL ARA DE A A C.

RECURSIVIDAD

Pgina 25

CMO SE RESOLVERA EL CASO EN QUE HUBIERA DOS AROS?

Colocando el ms pequeo en el asta B, pasando el grande a el asta C y despus moviendo el que est en B a C.

Cmo se resolvera el caso de tres aros?

RESOLUCIN DE UN PROBLEMA DE LAS TORRES DE HANOI


Entonces, por lo que hemos podido ver, el programa podra definirse de la siguiente manera:
Si es un solo disco, lo movemos de A a C. En otro caso, suponiendo que n es la cantidad de aros que hay que

mover Movemos los n-1 aros superiores - es decir, sin contar el ms grande- de A a B (utilizando a C como auxiliar). Movemos el ltimo aro (el ms grande) de A a C.
RECURSIVIDAD Pgina 26

Movemos los aros que quedaron en B a C (utilizando a A como auxiliar).

Dividir para vencer


Muchas veces es posible dividir un problema en subproblemas ms

pequeos, generalmente del mismo tamao, resolver los subproblemas y entonces combinar sus soluciones para obtener la solucin del problema original.
Dividir para vencer es una tcnica natural para las estructuras de datos, ya

que por definicin estn compuestas por piezas. Cuando una estructura de tamao finito se divide, las ltimas piezas ya no podrn ser divididas.

CDIGO FUENTE DE PROGRAMA DE LAS TORRES DE HANI.


public class Torres { static int contador=0,discos=0; String cadena=" "; public int moverdisco(int a, int b) { cadena=cadena+"Mover Disco de la Torre (("+a+")) Hacia la torre (("+b+"))\n"; JOptionPane.showMessageDialog(null,cadena); contador++; return 0; } public int movertorre(int n, int desde, int hacia, int piv) { if(n<2) { moverdisco(desde,hacia); } else { movertorre(n-1,desde,piv,hacia); moverdisco(desde,hacia); movertorre(n-1,piv,hacia,desde); } return 0; } public static void main(String args []) { Torres chale=new Torres(); discos=Integer.parseInt(JOptionPane.showInputDialog(null,"Numero de Discos","TORRES DE HANOI", JOptionPane.INFORMATION_MESSAGE)); JOptionPane.showMessageDialog(null,"Se Resolver para "+discos+" Disco (s)","TORRE DE HANOI",JOptionPane.INFORMATION_MESSAGE); chale.movertorre(discos,1,3,2); JOptionPane.showMessageDialog(null,"Resuelto en "+contador+" movimiento(s) ","TORRES DE HANOI",JOptionPane.INFORMATION_MESSAGE);

RECURSIVIDAD

Pgina 27

} }

RECURSION VS. ITERACIN


Repeticin Iteracin: ciclo explcito Recursin: repetidas invocaciones a mtodo Terminacin Iteracin: el ciclo termina o la condicin del ciclo falla. Recursin: se reconoce el caso base. En ambos casos podemos tener ciclos infinitos Considerar que resulta ms positivo para cada problema la eleccin entre eficiencia (iteracin) o una buena ingeniera de software, La recursin resulta normalmente ms natural. Las principales cuestiones son la claridad y la eficiencia de la solucin. En general: Una solucin no recursiva es ms eficiente en trminos de tiempo y espacio de computadora.
La solucin recursiva puede requerir gastos considerables, y deben

guardarse copias de variables locales y temporales.


Aunque el gasto de una llamada a una funcin recursiva no es peor, esta

llamada original puede ocultar muchas capas de llamadas recursivas internas.


El sistema puede no tener suficiente espacio para ejecutar una solucin

recursiva de algunos problemas.


Una solucin recursiva particular puede tener una ineficiencia inherente. Tal ineficiencia no es debida a la eleccin de la implementacin del

algoritmo; ms bien, es un defecto del algoritmo en s mismo.

RECURSIVIDAD

Pgina 28

Un problema inherente es que algunos valores son calculados una y otra

vez causando que la capacidad de la computadora se exceda antes de obtener una respuesta.
La cuestin de la claridad en la solucin es, no obstante, un factor

importante.
En algunos problemas una solucin recursiva es ms simple y ms natural

de escribir, como se observa en las siguientes funciones.


En algunos casos una solucin recursiva es ms simple y ms natural de

escribir.

RECURSIVIDAD

Pgina 29

ANLISIS DE COMPLEJIDAD EN RECURSIVIDAD

El anlisis de complejidad de tiempo y espacio de algoritmos recursivos depende de dos factores:

La profundidad (el nmero de niveles) de las llamadas recursivas hechas antes de llegar a la terminacin. A mayor profundidad, mayor espacio y tiempo de ejecucin. La cantidad de recursos consumidos en cada nivel de la recursin.

La ejecucin de un programa se puede diagramar trazando la ruta de ejecucin y creando una jerarqua con la llamada inicial en el tope. El diagrama resultante puede utilizarse para analizar el tiempo y el espacio del algoritmo.

RECURSIVIDAD ARBOLES
Los arboles representan las estructuras dinmicas y no lineales ms interesantes ms interesantes de la computacin. Las estructuras balanceadas o AVL en la estructura de datos ms eficiente para trabajar en la memoria rpida de la computacin. Por otra parte, la estructura de datos Arboles-B, representa la estructura de datos ms eficiente para trabajar en memoria secundaria dispositivos de almacenamiento secundario-.

RECURSIVIDAD

Pgina 30

Los rboles son una estructura inherentemente recursiva y todas las operaciones que se realizan en rboles se deben programar en forma recursiva. A diferencia de otras estructuras en las cuales las operaciones se pueden implementar tanto en forma recursiva como en forma iterativa, independiente de las diferencias que se pueden observar en cuanto a eficiencia en los rboles se puede trabajar en forma recursiva.

RECURSIVIDAD EN ORDENACIN RPIDA (QUICKSORT)


El algoritmo conocido como Quicksort (ordenacin rpida), recibe su nombre de su autor, Tony Hoare. La idea del algoritmo es simple, se basa en la divisin de particiones de la lista a ordenar. El mtodo es, posiblemente, el ms pequeo de cdigo, ms elegante, ms interesante, ms rpido y eficiente de los algoritmos de ordenacin.

RECURSIVIDAD

Pgina 31

El mtodo se basa en dividir los n elementos de la lista a ordenar en 3 partes o particiones: una particin izquierda, una particin central que solo contiene un elemento llamado pivote, y una particin derecha. La particin o divisin se hace de tal forma que todos los elementos de la primera sublista (particin izquierda) son menores que todos los elementos de la sublista (particin derecha). Las dos sublista se ordenan entonces independientemente. La lista se divide en dos particiones (sublistas) eligiendo un elemento de la lista que se utiliza como pivote o elemento de particin. Si se elige una lista cualquiera con los elementos ordenados aleatoriamente, se puede elegir cualquier elemento de la lista como elemento pivote, por ejemplo, el primer elemento de la lista. Si la lista tiene algn orden parcial, que se conoce, se puede tomar otra decisin para el pivote. Idealmente, el pivote se debe elegir de modo que se divida la lista exactamente por la mitad, de acuerdo al tamao relativo de las claves. Por ejemplo si se tiene una lista de elementos del 0 al 10, el pivote podran ser el 5 o 6.

RECURSIVIDAD

Pgina 32

Una vez que el pivote ha sido elegido se utiliza para ordenar la lista en dos sublistas: una tiene todos los elemento menores que el pivote y la otra particin todos los mayores o iguales que el pivote. Estas dos listas parciales se ordenan recursivamente, utilizando el mismo algoritmo, es decir, se llama sucesivamente al propio algoritmo Quitsort. La lista final ordenada se consigue concatenando la primera sublista, el pivote y la segunda sublista, en ese orden, es una nica lista.

RECURSIVIDAD

Pgina 33

ESTE PROGRAMA ES UN METODO DE ORDENAMIENTO RAPIDO CON RECURSIVIDAD TE ORDENA DE MENOR A MYOR DE UNA SERIE DE NUMEROS ENTEROS POSITIVOS. public class Quicksort { public void captura() { int n, a[]; String c=""; n=Integer.parseInt(JOptionPane.showInputDialog(null,"Cuantos elementos a ordenar")); a=new int[n]; for(int x=0; x<n; x++) { a[x]=Integer.parseInt(JOptionPane.showInputDialog(null,"Introdusca el numero "+x)); if(x==n-1) quicksort(a,0,n-1); } c="Los numeros ordenados son\n"; for(int x=0; x<n; x++) { c=c+"Array["+x+"]="+a[x]+"\n"; } JOptionPane.showMessageDialog(null,""+c); }

void quicksort(int a[], int primero, int ultimo) { int i, j, central; int pivote; central=(primero + ultimo)/2; pivote=a[central]; i=primero; j=ultimo; do { while (a[i]<pivote) { i++; } while (a[j]>pivote) { j--; } if(i<=j) { int tmp; tmp=a[i]; RECURSIVIDAD Pgina 34

a[i]=a[j]; a[j]=tmp; i++; j--; } } while(i<=j); if(primero<j) quicksort(a,primero,j); if(i<ultimo) quicksort(a,i,ultimo); } public static void main(String ar[]) { Quicksort ob=new Quicksort(); ob.captura(); } }

RECURSIVIDAD

Pgina 35

PROGRAMA RECURSIVO QUE HACE EL LLENADO DE UN ARREGLO Y LO IMPRIME EN UNA SOLA VENTANA Y TAMBIEN LA IMPRIME POR ARREGLO. public class Arreglo { static String a="",Llena[];; static int x,z=-1,tam; static String llena(int w) { if(w==0); else { z++; Llena[z]=JOptionPane.showInputDialog(null,"Introdusca Numero"); a=a+"Arreglo ["+z+"] = "+Llena[z]+"\n"; llena(w-1); } return a; } static void impri() { for(int s=0;s<tam;s++) { JOptionPane.showMessageDialog(null,"Arreglo ["+s+"] = "+Llena[s]); } } public static void main(String a[]) { tam=Integer.parseInt(JOptionPane.showInputDialog(null,"CUANTOS NUMERO DESEA AGREGAR")); Llena= new String [tam]; JOptionPane.showMessageDialog(null,"EL ARREGLO ES : \n\n"+llena(tam)); impri(); } }

CALCULA LAS COMBINACIONES MATEMATICAS nCr

RECURSIVIDAD

Pgina 36

public class Combinaciones_n_C_r { static int com(int n,int r) { if(r==0 || n==0) { return 1; } else { if(r==0) { return n; } else { return com(n-1,r)+com(n-1,r-1); } } } public static void main (String arg[]) { int a,b; a=Integer.parseInt(JOptionPane.showInputDialog(null,"Introduaca Numero N")); b=Integer.parseInt(JOptionPane.showInputDialog(null,"Introduaca Numero r")); JOptionPane.showInputDialog(null,"Combunatorio "+a+" C "+b+" = "+com(a,b)); } }

RECURSIVIDAD

Pgina 37

ESTE PROGRAMA IMPRIME HOLA 3 VECES Y LUEGO SE SALE DICIENDO SHAO.

public class Impre_Hola { void imp(int z) { if(z<3) { JOptionPane.showMessageDialog(null,"HOLA "); imp(z+1); } else JOptionPane.showMessageDialog(null,"SHAO"); } public static void main(String arg[]) { Impre_Hola o=new Impre_Hola(); o.imp(0); } }

RECURSIVIDAD

Pgina 38

ESTE PROGRAMA CALCULA EL MAXICO COMUN DIVISOR DE 2 NUMERO POSITIVOS.

public class MaxCD { static int MCD(int a, int b) { if(a!=b) { if(a>b) { a=a-b; } else { b=b-a; } return MCD(a,b); } return a; } public static void main(String arg[]) { MaxCD a=new MaxCD(); int p,q; p=Integer.parseInt(JOptionPane.showInputDialog(null,"Inttodusca primer numero")); q=Integer.parseInt(JOptionPane.showInputDialog(null,"Introdusca segundo numero")); JOptionPane.showMessageDialog(null,"el maximo comun divisor es: " +MCD(p, q)); } }

RECURSIVIDAD

Pgina 39

ESTE PROGRAMA CALCULA EL MAXIMO COMUN DIVISOR DE 2 NUMERO ENTEROS POSITIVOS (DIFERENTE LOGICA). public class MaxComDiv { static int mcd(int m,int n) { if(n<=m && m%n==0) return n; else if(m<n) return mcd(n,m%n); else return mcd(n,m%n); } public static void main(String arg[]) { MaxComDiv o = new MaxComDiv(); int m,n; do { m=Integer.parseInt(JOptionPane.showInputDialog(null,"INTRODUSCA EL PRIMER NUMEO")); n=Integer.parseInt(JOptionPane.showInputDialog(null,"INTRODUSCA SEGUNDO NUMERO")); } while(n<=0 || m<=0); JOptionPane.showMessageDialog(null,"EL MAXIMO COMUN DIVISOR ES: "+mcd(m,n)); } }

RECURSIVIDAD

Pgina 40

ESTE PROGRAMA BUSCA EL MAYOR DE N NUMEROS ENTEROS.

public class Mayor_n { static int i=-1,tn,a[],x; public void cap() { tn=Integer.parseInt(JOptionPane.showInputDialog(null,"CUANTOS NUMERO")); a=new int [tn]; JOptionPane.showMessageDialog(null,"EL MAYOR ES "+mayor()); } static int mayor() { i++; if(i<tn) { a[i]=Integer.parseInt(JOptionPane.showInputDialog(null,"Intodusca Numero")); if(x<a[i]) { x=a[i]; return mayor(); } return mayor(); } return x; } public static void main(String arg[]) { Mayor_n o=new Mayor_n(); o.cap(); } }

RECURSIVIDAD

Pgina 41

ESTE PROGRAMA CALCULA EN MENOR DE N NUMERO POSITIVOS. public class Menor_n { static int i=-1,tn,a[],x; public void cap() { tn=Integer.parseInt(JOptionPane.showInputDialog(null,"CUANTOS NUMERO")); a=new int [tn]; JOptionPane.showMessageDialog(null,"EL MENOR ES "+menor()); } static int menor() { i++; if(i<tn) { a[i]=Integer.parseInt(JOptionPane.showInputDialog(null,"Intodusca Numero")); if(i==0) { x=a[i]; return menor(); } else { if(x>a[i]) { x=a[i]; return menor(); } else { return menor(); } } } return x; } public static void main(String arg[]) { Menor_n o=new Menor_n(); o.cap(); } } ESTE PROGRAMA CALCULA SI UN NUMERO ES PAR O IMPAR.

RECURSIVIDAD

Pgina 42

public class Par_Inpar { public int pi(int x) { if(x%2==0) { return 0; } else { return 1; } } public static void main(String arg[]) { int z; Par_Inpar p=new Par_Inpar(); z=Integer.parseInt(JOptionPane.showInputDialog(null,"INTRODUSCA NUMERO")); if(p.pi(z)==0) { JOptionPane.showMessageDialog(null,"EL NUMERO ES PAR"); } else { JOptionPane.showMessageDialog(null,"EL NUMERO NO PAR"); } } }

ESTE PROGRAMA CALCULA UN NUMERO ELEVADO A LA POTENCIA N ( XN )

RECURSIVIDAD

Pgina 43

public class Potencia_de_un_numero { static int potencia(int x,int y) { if(y==0) { return 1; } else { return x*potencia(x,y-1); } } public static void main(String arg[]) { int a,b; a=Integer.parseInt(JOptionPane.showInputDialog(null,"Introduaca Numero")); b=Integer.parseInt(JOptionPane.showInputDialog(null,"Introduaca Potencia")); JOptionPane.showInputDialog(null,"Resulatado "+a+" ^ "+b+" = "+potencia(a,b)); } }

ESTE PRORAMA CALCULA LA SUMA DE N NUMERO ENTEROS POSITIVOS.

public class Sum_n { int z; public int sum(int x) { z=Integer.parseInt(JOptionPane.showInputDialog(null,"Introdusca Nuemro")); if(x==1) return z;

RECURSIVIDAD

Pgina 44

else return z+ sum(x-1); } public static void main (String arg []) { int a; Sum_n ob= new Sum_n (); a=Integer.parseInt(JOptionPane.showInputDialog(null,"CUANTOS NUMEROS")); JOptionPane.showMessageDialog(null,"LA SUMA ES: "+ ob.sum(a)); } }

ESTE PROGRAMA TE INPRIME EL ABECEDARIO EN MAYUSCULA DE LA A Z

public class alfabeto { static String a=""; public static void main (String [] arg) { metodoA('Z'); JOptionPane.showMessageDialog(null,a); } static void metodoA(char c) { RECURSIVIDAD Pgina 45

if (c>='A') { metodoB(c); a=a+" "+c+" "; } } static void metodoB(char c) { metodoA(--c); } }

BIBLIOGRAFA

Allen Weiss, Mark. Estructura de datos en Java. Addison Wesley. pp. 165-201.
Pgina 46

RECURSIVIDAD

Joyanes, Aguilar Luis. Fundamentos de programacin:Algoritmos, Estructura de datos y objetos. Mc Graw Hill. pp. 537-568.

Cairo, Osvaldo. Estructura de datos. Mc Graw Hill. pp. 109-137.

http://ocw.udem.edu.mx

http://www.itescam.edu.mx/principal/sylabus/fpdb/recurs os/r4886.PDF

RECURSIVIDAD

Pgina 47

También podría gustarte