domingo, 27 de octubre de 2013

Cola circular, bicolas y recursividad

Cola circular

Una cola circular o anillo es una estructura de datos en la que los elementos están de forma circular y cada elemento tiene un sucesor y un predecesor. son un poco mas claras que las colas normales ya que esta permite que los elementos pueden consultarse, añadirse y eliminarse únicamente desde la cabeza del anillo que es una posición distinguida y de esta forma se haría mas fácil la eliminación y la adición de un dato. Existen dos operaciones de rotaciones, una en cada sentido, de manera que la cabeza del anillo pasa a ser el elemento sucesor, o el predecesor, respectivamente, de la cabeza actual.





En esta, las instrucciones son diferentes, ejemplo: cuando esta llena: (frente==0 &&fin==max-1)


Bicolas:
La bicola o doble cola es un tipo de cola especial que permiten la inserción y eliminación de elementos de ambos extremos de la cola. Puede representarse a partir de un vector y dos índices, siendo su representación más frecuente una lista circular doblemente enlazada.

Esta estructura es una cola bidimensional en que las inserciones y eliminaciones se pueden realizar en cualquiera de los dos extremos de la bicola. Gráficamente representamos una bicola de la siguiente manera:



Recursividad:




Propiedad de las funciones (metodos) de auto llamarse, son una alternativa de los procesos iterativos. "Todo lo que se haga iterativamente tambien puede hacerse recursivamente"

"Todo lo que se haga con: "For- while- do while" son procesos iterativos"
La recursividad es util cuando el proceso iterativo es muy complejo.
-Recorrido de estructuras no lineales, solucion de formulas matematicas complejas-
- Recursividad vs Iteracion: Primero que todo, la recursividad se aplica en metodos, la iteracion se aplica con for, while, do-while.
-La recursividad tiene reduccion de codigo, la logica es simple, mientras que la iteracion no reduce el codigo.

Aunque si usted no ha comprendido bien la recursividad, la logica no le parecera simple, con respecto a la iteracion, la solucion (logica) depende del problema, y esta puede que sea muy compleja.
Aparentemente, la recursividad es mejor que las iteraciones, asi como ellas, esta tambien tiene us desventajas, como lo es el consumo considerable de memoria, ya que por cada autollamado se hace una copia de la funcion, que es guardada por el sistema operativo en una pila( llamado a subprogramas), Los procesos iterativos tienen un bajo nivel de consumo de memoria, por eso no se han desaparecido, ni creo que desapareceran, tienen un bajo nivel de consumo y son eficientes en sus procesos pequeños, ya que si toca, por ejemplo, imprimir 10 numeros con un "for", el solamente realiza 10 vueltas y los imprime, en cambio si usamos recursividad para imprimir los mismos 10 numeros, los imprimiria, pero esta duplicaria hasta 10 veces la cantidad de memoria por funciones.

Implementacion:
Igual que toda funcion, tiene una parte de acceso, para tener un modificador, puede tener un tipo, una clase, un nombre, y unos parametros( igual tiene sus variables, puede tener variables locales), expresado de la siguiente forma.

Acceso modificador/ clase nombre(parametros){
           //Variables locales
              //if(Condicion de parada){
                     Instrucciones
            }
 Instrucciones                              ---- Autollamado, Nombre(parametros actuales)




Consiste en, colocar el nombre del metodo con parametros actuales, es decir el mismo nombre del metodo se simula como un auto llamado, ella misma dentro de sus instrucciones se llama
-Los libros colocan como ejemplo los factoriales, aunque no creo que sea conveniente usar un proceso recursivo siendo este un proceso iterativo, pero bueno, recursivamente seria asi:

Si sabemos que n! = n*(n-1)!
entonces tenemos que:
5!=5*4!/24=120
4!=4*3!/6=24
3!=3*2!/2=6
2!=2*1!/1=2
1!=1*0!/1=1
0!=1
Vemos que "n" va disminuyendo entonces estoy seguro que (n==0) retorna un 1, pero si no  otra cosa, en codigo seria asi n*factorial (n-1)

public static long factorial(int n){
if(n==0){
return 1;
}else{
return n*factorial(n-1);
}
}
Cuando llegue hasta 0, una funcion iterativa normalmente no tiene funciones iterativas, solo tiene instrucciones condicionales que haran que en algun momento pare.



0 comentarios :

Publicar un comentario