• Viernes 29 de Marzo de 2024, 01:49

Autor Tema:  Duda Sobre Recursividad  (Leído 1922 veces)

ferchum

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Duda Sobre Recursividad
« en: Sábado 25 de Junio de 2005, 04:14 »
0
tengo una duda sobre el siguiente codigo:

procedure visual (cadena:string);
begin
write(copy(cadena,1,1);
if cadena <> copy(cadena,lenght(cadena),1) then
                                          begin
                                           visual(copy(cadena,2,lenght(cadena)));
                                           write(copy(cadena,1,1))
                                           end;
                                 else
                                           write(copy(cadena,1,1);
end;
Lo que hace este codido dado una palabra escribe esa palabra y la inversa todo junto
Ej: mariposa
    salida del mensaje : mariposaasopiram
Bueno aca va mi pregunta segun me dijieron en la recursividad no es eficiente cuando usas otras funciones dentro de la recursividad? esto es verdad agradeceria su ayuda

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Duda Sobre Recursividad
« Respuesta #1 en: Domingo 26 de Junio de 2005, 17:25 »
0
En realidad por lo general un código iterativo es más eficiente que uno recursivo. ;)

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Duda Sobre Recursividad
« Respuesta #2 en: Lunes 27 de Junio de 2005, 01:55 »
0
Cita de: "ferchum"
tengo una duda sobre el siguiente codigo:

procedure visual (cadena:string);
begin
write(copy(cadena,1,1);
if cadena <> copy(cadena,lenght(cadena),1) then
                                          begin
                                           visual(copy(cadena,2,lenght(cadena)));
                                           write(copy(cadena,1,1))
                                           end;
                                 else
                                           write(copy(cadena,1,1);
end;
Lo que hace este codido dado una palabra escribe esa palabra y la inversa todo junto
Ej: mariposa
    salida del mensaje : mariposaasopiram
Bueno aca va mi pregunta segun me dijieron en la recursividad no es eficiente cuando usas otras funciones dentro de la recursividad? esto es verdad agradeceria su ayuda
Cada vez que se anidan llamadas recursivas se tienen que copiar todos los parámetros de la función a la pila antes de hacer la llamada recursiva y luego volver a sacarlos de la pila y copiarlos a su posición de memoria original. Esto consume tiempo de CPU y memoria en los apilamientos sucesivos.

Si puedes convertirlo en iterativo te ahorras todos esos apilamientos. En tu ejemplo pasas como parámetro una cadena, asi que cada vez que se anida tu proceso recursivo se hace una copia de esta cadena y se guarda en la pila.  

Otro lio es ese "write" que apenas escribe un caracter en medio de tu código recursivo. Así tu código sea recursivo o iterativo, utilizar un "write" para escribir un sólo caracter es desperdiciar recursos. Mejor guarda tu resultado en memoria, en otra cadena, y al final muestra en pantalla el resultado final con un solo write.

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Duda Sobre Recursividad
« Respuesta #3 en: Jueves 30 de Junio de 2005, 19:12 »
0
Bueno, solo añadir algo a lo que te contestaron, como bien te dijeron, el realizar un algoritmo de manera recursiva por lo general consume mas recursos que de manera no recursiva, entonces a lo mejor te preguntaras ¿cual es la ventaja de hacerlo de manera recursiva?

La razon seria simplicidad, hay algoritmos que se realizan de manera mas simple y natural de manera recursiva que si los implementaramos de manera no recursiva. Un ejemplo clasico que se me ocurre seria resolver el problema de las torres de hanoi (la solucion es mas natural de implementar de manera recursiva que de manera no recursiva). Obviamente en ese caso debemos aquilatar si deseamos simplicidad al hacer el algoritmo, o eficiencia en el uso de recursos.

Un saludo 8)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================