• Viernes 15 de Noviembre de 2024, 08:29

Autor Tema:  Recursividad  (Leído 4987 veces)

Bgirl

  • Miembro activo
  • **
  • Mensajes: 62
    • Ver Perfil
Recursividad
« en: Lunes 31 de Mayo de 2004, 18:19 »
0
Hola, Que tal!!! :hola:

se que no todos los ambientes de programación proveen las facilidades necesarias para la recursión y adicionalmente, a veces su uso es una fuente de ineficiencia inaceptable. Por lo cual se prefiere eliminar la recursión. Mi pregunta es, como puedo hacerlo?????

Thankxxx :smartass:
[size=109]Hack To Construct, Never To Destroy!!!![/size]

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Recursividad
« Respuesta #1 en: Lunes 31 de Mayo de 2004, 18:54 »
0
Eso es simplemente ridículo. Un programador inexperto/desordenado siempre hará estragos usando cualquier técnica/lenguaje/compilador por muy buenos que sean.

The Black Boy

  • Miembro de PLATA
  • *****
  • Mensajes: 1043
  • Nacionalidad: co
    • Ver Perfil
    • http://www.mslatam.com/latam/technet/mva2/Microsite.aspx?alias=JairoDiaz
Re: Recursividad
« Respuesta #2 en: Lunes 31 de Mayo de 2004, 19:07 »
0
Citar
Eso es simplemente ridículo. Un programador inexperto/desordenado siempre hará estragos usando cualquier técnica/lenguaje/compilador por muy buenos que sean.
de acuerdo con tigo Amilius...  y tu pregunta  Bgirl
Citar
Por lo cual se prefiere eliminar la recursión. Mi pregunta es, como puedo hacerlo?????

Jamas habia escuhado que alguien prefiera eliminar la recursion.. al contrario :think:  siempres he escuhado que es bastante eficiente   :comp:

pero si lo que quieres es eliminar la recursion pues lo unico que tienes que hacer es escoger un metodo programacion y un algoritmo .... y pues no se que mas decirte  :blink:   :whistling:

Saludos   :smartass:
El inteligente no es aquel que lo sabe todo
sino aquel que   sabe utilizar lo poco que sabe.


Espacio Personal

si necesitas algo de programacion click aqui, si no esta aqui no existe

Programacion]

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Recursividad
« Respuesta #3 en: Lunes 31 de Mayo de 2004, 19:13 »
0
Cita de: "The Black Boy"
siempres he escuhado que es bastante eficiente

Facilita en muchos casos el algoritmo, pero conlleva la sobrecarga de una llamada a una función por cada iteración (bueno, no es iteración pero no sé cómo llamarlo) y se corre el riesgo de desbordar la pila.

Cita de: "Bgirl"
como puedo hacerlo?????

Depende del caso concreto. Por ejemplo, la función recursiva para obtener un número de la sucesión de Fibonacci es fácil de implementar con un bucle con variables acumuladoras.

Un saludo.

Ruben3d

Bgirl

  • Miembro activo
  • **
  • Mensajes: 62
    • Ver Perfil
Re: Recursividad
« Respuesta #4 en: Lunes 31 de Mayo de 2004, 19:14 »
0
Pues la verdad no se a quien creerle, como no soy una experta, primero escucho a los expertos, analizo y saco mis conclusiones... En realidad, fue algo que mi profesor de la universidad me dijo, que remover la recursión es complicado pero una vez hecha ésta, la versión del algoritmo es siempre más eficiente.  

De todas formas seguire investigando... :smartass:
[size=109]Hack To Construct, Never To Destroy!!!![/size]

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Recursividad
« Respuesta #5 en: Lunes 31 de Mayo de 2004, 19:18 »
0
Citar
remover la recursión es complicado pero una vez hecha ésta, la versión del algoritmo es siempre más eficiente

Cierto.

Un saludo.

Ruben3d

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Recursividad
« Respuesta #6 en: Lunes 31 de Mayo de 2004, 19:49 »
0
Cita de: "Bgirl"
En realidad, fue algo que mi profesor de la universidad me dijo, que remover la recursión es complicado pero una vez hecha ésta, la versión del algoritmo es siempre más eficiente.
Ya me lo imaginaba...

El problema es que existen otras prioridades: Aumentar funcionalidades, mejorar la estética, etc. Muy poco tiempo=dinero para optimizaciones que además pueden causar futuros bugs=perdidas. Te aseguro que en el mundo real jamás optimizarás algo hecho recursivamente A MENOS que sea del tipo simple:

<< Si sólo existe una llamada recursiva al final de la función recursiva. >>

Sólo en ese caso se las pueden convertir en simples ciclos.

Los otros casos no son fáciles de programar sin recursividad (Tienes que programar la pila personalmente :( )

En el mundo real a nadie se le ocurrirá optimizar de esa forma ¿Que ganarás, un 3% más de velocidad.. unos cuantos kbytes menos de consumo de RAM?. Tendría que ser un algoritmo realmente y brutalmente crítico. Sólo optimizen código si el usuario SENTIRA una GRAN MEJORA, o estarán perdiendo tiempo/dinero.

Respecto a desbordar la pila:

Siempre que se haga más de una llamada recursiva dentro de la función teniendo cuidado de definir el punto muerto de la recursividad no tendrás que preocuparte por desbordar la pila:

1.- El consumo de ram de tus parámetros por lo general no pasará de un puñado de bytes.

2.- Número de niveles de recursividad, digamos 100, implica procesar la función para digamos 2 llamadas recursivas dentro de la función= 2^100 (eso es bastante tiempo :) ), y si multiplicas digamos unos 32 bytes de parámetros por 100 niveles te dan algo de 3kb de RAM. Además dudo que se pasen de 20 niveles de recursividad salvo excepciones muy pero muy raras.

"la versión del algoritmo es siempre más eficiente" ¿Seguro que no se refería sólo a los casos simples que se pueden programar con un ciclo?

Tu profe no penso mucho para decir eso...

- SIEMPRE ??? Y que pasa si es un programador novato?

- Tienes que tener elevado nivel de programación para hacerlo más eficiente que el compilador y repito de LA CALIDAD DEL COMPILADOR resultará código más rápido o más lento.

- En la mayoría de los casos bastará pensar bien los tipos de los parámetros que pasarás y ahorrarte cada byte que puedas.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Recursividad
« Respuesta #7 en: Martes 1 de Junio de 2004, 07:20 »
0
En mi opinion hoy en dia usar la recursividad es una perdida de tiempo en la gran mayoria de los casos.
antiguamente se usaba mucho porque ahorraba la utilizacion de memoria al cargar los programas, pero hoy en dia esa ayuda no es mucha.

Una cosa muy aparte es el desbordamiento de pila que realmente no tiene nada que ver que la memoria RAM, este desbordanmiento ocurre cuando la pila o fila entrada de instrucciones al procesador se llena y seguir escribiendo en ella produce su desboradmiento.

Esto sucede porque cada vez que el procesador o  bien que la pila de instrucciones atiende una llamada recursiva, ocurre un cambio de contexto en el proceso y esto implica guardar el estado actual de todos los registros y guardar un apuntador adicional al conjunto de instrucciones de la funcion recursiva, lo cual tras varias repeticiones termina por llenar la pila de llamadas del procesador ya que se queda sin recursos para poder realizar el cambio de contexto.

Asi pues procesos sencillos que no consuman nada de memoria RAM aun en 10000 llamadas recursivas,  podrian desbordar facilmente la pila del procesador en solo unas cuantas iteraciones.

La mayoria de las veces es mucho más dificil hacer un programa con recursividad que con un ciclo comun y corriente, por ello me parece una tecnica muy inoficiosa pero que nos puede sacar de apuros en casos como este, que es fragmento de un ordenamiento quick sort aplicado a listas doblemente enlazadas y que hice hace ya como dos años.. por mas vueltas que le di al asunto no encontre otro modo de hacerlo diferente del de la recursividad:
Código: Text
  1.  
  2. /*METODO QUICK SORT (RECURSIVO)
  3. **Preferible invocar la funcion void quicksort,  lan cual se invoca de manera
  4. **natural, es decir de la misma maner que los demas metodos.
  5. **(ver m s abajo)*/
  6. void INquicksort(struct Data *rider,int desde,int hasta)
  7. {
  8.   int izq,der,cont,CRUCE=0;
  9.   struct Data *IZQ,*DER,*DESDE,*HASTA;
  10.  
  11.   if(desde&#60;hasta)/*si el array o subarray es mayor a 1 item*/
  12.   { /* Valores iniciles de la b£squeda.*/
  13.     cont=Counter(rider);
  14.     izq=desde+1;
  15.     der=hasta;
  16.     IZQ=(struct Data *)MoveToN(rider,izq);
  17.     DESDE=(struct Data *)MoveToN(rider,desde);
  18.     DER=HASTA=(struct Data *)MoveToN(rider,hasta);
  19.     while(!CRUCE)
  20.     {
  21.       while(IZQ!=HASTA && IZQ-&#62;info&#60;=DESDE-&#62;info)/*busqueda de un # mayor*/
  22.       {
  23.         IZQ=IZQ-&#62;Post;
  24.       }
  25.       while(DER!=DESDE && DER-&#62;info&#62;=DESDE-&#62;info)/*busqueda de un # menor*/
  26.       {
  27.         DER=DER-&#62;Pre;
  28.       }
  29.       if(MyNumber(IZQ)&#60;MyNumber(DER))/*si no se han cruzado:*/
  30.       {
  31.         IZQ-&#62;info+=DER-&#62;info; /* Intercambiar.*/
  32.         DER-&#62;info=IZQ-&#62;info-DER-&#62;info;
  33.         IZQ-&#62;info-=DER-&#62;info;
  34.       }
  35.       else /* si se han cruzado:*/
  36.        CRUCE=1;/* salir del bucle.*/
  37.     }
  38.     /*el m s peque¤o, desde se cambia con ‚l menor encontrado.*/
  39.     if(DER!=DESDE)
  40.     {
  41.       DER-&#62;info+=DESDE-&#62;info;/*/ Colocar el pivote*/
  42.       DESDE-&#62;info=DER-&#62;info-DESDE-&#62;info;/*en su posici¢n.*/
  43.       DER-&#62;info-=DESDE-&#62;info;
  44.     }
  45.     if(MyNumber(DER)!=1)
  46.       INquicksort(rider,desde,MyNumber(DER-&#62;Pre));/*Ordenar el primer array.*/
  47.     if(MyNumber(DER)!=cont)
  48.       INquicksort(rider,MyNumber(DER-&#62;Post),hasta);/*Ordenar el segundo array.*/
  49.   }
  50. }
  51.  
  52. /*llama a la funci¢n metodo INquicksort de manera natural.*/
  53. void quicksort(struct Data *rider)
  54. {
  55.   int desde=1,hasta=Counter(rider);
  56.   INquicksort(rider,desde,hasta);
  57. }
  58.  
  59. /*      &#092;|||/
  60.         (o o)
  61. -----ooO-(_)-Oooo-----*/
  62.  
  63.  

antiguamente (hace 10 años o más)Cuando se hablaba de eficiencia usando recursividad se referia al ahorro de memoria ram y de espacio en disco ya que el codigo compilado o bien sin compilar ocupaba mucho menos espacio.
Esto era muy importante sobre todo en computadores muy viejos que tardaban horas cargando un programa desde disco o desde tarjetas perforadas a memoria...
pero hoy en dia me parece un absurdo usar recursividad con  ese argumento, el argumento que para mi seria valido hoy en dia sera como el del ejemlo..
simplemente hay cosas que son mas faciles de deducir el algoritmo si se hacen repitiendo siempre una rutina precisa como lo es ordenar un rango determinado anidado dento de otro..
en el ejemplo la anidacion es complicada (en ese entonces me parecio imposible) haciendola a travez de ciclos mientras que por medio de recursividad fue relativamente sencillo.

Ahora si hablamos de eficiencia a nivel de velocidad , en general las operaciones recursivas suelen ser mucho más rápidas porque poseen un juego de instrucciones mucho mas reducido y casi siempre invertimos muchas mas horas ideando como hacer algo recursivo y por lo mismo en general se crean algoritmos mas eficientes.

Sin embargo un novato usando recursividad es un desastre!!!
salvo que este haciendo lo del fibonnacci u operaciones pequeñas, pero es que en estos casos no vale la pena usar recursividad porque no se nota la diferecia, salvo encasos com en el de la potenciacion a travez de recursividad, en el cual es muy probable que se desborde la pila con numeros grandes mientras que usando ciclos seria muy dificil o mas bien imposible que esto ocurriera.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

-SB-

  • Miembro activo
  • **
  • Mensajes: 60
    • Ver Perfil
Re: Recursividad
« Respuesta #8 en: Sábado 5 de Junio de 2004, 11:51 »
0
En primero de carrera nos hablaron de ese problema, pues es cierto que a veces la recursividad sale cara, pero hacer el algoritmo recursivo es algo bien sencillo.

El problema de lo caro que sale un algoritmo recursivo reside en que no siempre nuestros programas van a ir en ordenadores de alta capacidad.. tb hay equipos mas pequeños que necesitan programas.

Nos hablaron para ello del metodo de un tal Burstall que se basa en unos sencillos pasos para pasar de un algoritmo recursivo a uno iterativo.

Comentan por ahi arriba que solo es posible pasar a iterativo facilmente programas que contengan una llamada recursiva, pero eso no es asi, con este metodo podemos hacerlo con cualquier algoritmo, tenga las llamadas que tenga.

En su base el metodo trata primero con un ejemplo de doblar y desdoblar lo q hace el algoritmo recursivo, y de ese doblaje-desdoblaje puede uno llegar a una invariante. Una vez obtenida la invariante de la iteracion es facil obtener el resto de las ordenes del algoritmo..

Busca iformacion en internet sobre Burstall y te voy a dar un poco de bibliografia tambien:

Programacion Metódica
Balcázar J.L. MacGraw-Hill, 1993.

En este libro puedes encontrar temas que tienen que ver con recursividad, en concreto especificacion ecuacional de tipos de datos, tecnicas para optimizar los algoritmos recursivos (sin volverlos iterativos), y transformacion de algoritmos recursivos a iterativos.

Un saludo!!!!!!!!

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Recursividad
« Respuesta #9 en: Domingo 6 de Junio de 2004, 00:33 »
0
No sabía que existiera un método general para evitar todo tipo de recursividad.  :nosweat:

¿Y alguna vez usaste ese algoritmo general para evitar la recursividad? :huh:
¿Que tan práctico es? :comp:
¿En cuanto tiempo convertirías un ejemplo simple como las torres de Hanoi?   :think:

Voy a revisar algunos enlaces para ver que puedo aprender de ese método.  ^_^

-SB-

  • Miembro activo
  • **
  • Mensajes: 60
    • Ver Perfil
Re: Recursividad
« Respuesta #10 en: Domingo 6 de Junio de 2004, 13:04 »
0
No es un metodo muy rapido de hacer, bueno tampoco coji mucha practica, lo justo para hacerlo en el examen jejeje.. (no lo he vuelto a necesitar para nada). Los ejercicios del examen no eran muy avanzados, sino calcular la cantidad de nodos de un arbol etc..

Hacerlo con un ejercicio simple como ese (el del arbol) puede llevar una media hora.

En la vida real no he vuelto a usarlo nunca.. pero bueno, culturilla general, saber que existe y mas o menos como es (¡no vaya ser que algun dia haga falta!).

Salu2!!

joaquinrg

  • Miembro activo
  • **
  • Mensajes: 50
    • Ver Perfil
Re: Recursividad
« Respuesta #11 en: Lunes 7 de Junio de 2004, 22:38 »
0
hola, yo estoy en primero de informatica... y para el examen de dentro de un par de dias entra eso de eliminar la recursivida... ahora mismo no tengo ni idea de como va, si dentro de un par de dias me entero lo pondre, se que es un metodo general tambien, pero aun no me lo he estudiao ... es el ultmo tema...

como ejemplo nos pusieron el de las torres de hanoi... el profesor le quito la recursivida en 5 minutos, pero yo puedo estar toda la tarde y no conseguirlo