elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda con recursividad
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con recursividad  (Leído 3,279 veces)
sainax_1

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Ayuda con recursividad
« en: 27 Mayo 2021, 23:50 pm »

Me piden en la u realizar programas con recursividad, pero no logro entender este concepto. Alguien me podria explicar con algun ejemplo?


En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.351


Ver Perfil
Re: Ayuda con recursividad
« Respuesta #1 en: 28 Mayo 2021, 04:04 am »

Un ejemplo muy sencillo de entender... es la jerarquía de ficheros del PC...

Sabrás bien que una carpeta puede contener ficheros y otras carpetas. Y cada carpeta interna, igualmente puede contener más ficheros y más subcarpetas, y esas... lo mismo.
Entonces se plantea... cómo recorrer cada carpeta?. La recursividad simplifica enormemente el proceso de dicho recorrido.

Imagineos que se nos pide el tamaño total que ocupa una carpeta con todo su contenido...

Código:
entero = funcion RecorrerCarpetas( string Ruta)
     string fichero, carpeta
     entero size

     por cada fichero en ruta
         size += fichero.length
     siguiente

     por cada carpeta en ruta
         size += RecorrerCarpetas(carpeta)  //<--------- aquí la recursividad.
     siguiente
     
     devolver size
fin funcion

Hay dos bucles dentro de esa función, el primero recorge el tamaño de cada fichero suelto en esa carpeta.
El segundo bucle recoge cada carpeta que mantiene la ruta... y como cada carpeta puede contener más carpetas y o ficheros, hace una llamada a la función que totaliza el contenido de dicha carpeta, que curiosamente es la misma función en la que está.
Eso es la recursividad, una función que directamente se llama a sí misma (o indirectamwente a través de otra).

Todo lo que tenga una estructura arbórea es factible de ser recorrido recursivamente, aunque hay más situacione en programación, por ejemplo al tratar con combinatoria, utilizar recursividad puede simplificar ciertas operaciones.

La recursividad debe limitarse a ser usado cuando es preciso, siempre que se pueda es preferible usar iteratividad, pero hay determinadas situaciones, en las que diseñar bucles iterativos es mucho más complejo que bucles iterativos.
El mismo ejemplo anterior utilizando bucles iterativos sería bastante más engorroso... puedes intentarlo, si quieres.



En línea

fzp

Desconectado Desconectado

Mensajes: 130


Ver Perfil
Re: Ayuda con recursividad
« Respuesta #2 en: 30 Mayo 2021, 13:56 pm »

Y dejando aparte la complejidad de la lógica interna ¿existen diferencias, ventajas o desventajas, en cuanto al uso de recursos del sistema, entre usar recursividad o no usarla?

Si existen diferencias en:
- tiempo de ejecución, ¿tarda uno más que otro?
- tiempo de compilación
- uso de recursos, por ejemplo memoria, ¿consume más uno que otro?
« Última modificación: 30 Mayo 2021, 14:15 pm por fzp » En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.351


Ver Perfil
Re: Ayuda con recursividad
« Respuesta #3 en: 30 Mayo 2021, 15:40 pm »

La recursividad usa una llamada a una función y toda llamada a una función exige guardar en la pila el estado actual. Y a la vuelta 'escupir fuera' lo que se guardó en la pila... esto supone un tiempo preciso para dicho proceso (las dos partes) y un consumo de memoria.
Que estos sea muy elevado o muy ligero va a depender exclusivamente de lo complejo de la función (cuántos datos deba guardar) y el nivel de profundidad de la recursividad...

...en el caso de ejemplo (de las rutas), puede estimarse despreciable desde el punto de vista 'humano', por que como ya he dicho el nivel de profundidad de anidamiento de carpetas está limitado en 32, pero lo normal es que ese nivel no se alcance más que pocas veces. De igual modo el número de parámetros para guardar y rescatar de la pila, son pocos. Pero ciertamente suele asumirse siempre que es así.

Cuando la recursividad sea indirecta y por tanto a través de una llamada externa que además exija un enlace en tiempo de ejecución, es cuando puede ser más lento. Pero esto no será muy frecuente...

Otra cosa a tener en cuenta es que un sistema que se presta a ser recursivo, intentar hacerlo iterativo, puede ser menos eficiente... el caso inverso es todavía más drástico, un sistema que se presta a ser iterativo hacerlo recursivo suele ser drásticamente menos eficiente. Por eso, cada caso debe hacerse con la forma natural que propiamente se expresa. Naturalmente dicho así, parece algo subjetivo cuando falta experiencia al programador, no lo es cuando se conocen las cosas a fondo.

En la compilación no hay diferencia apreciable. Puede haberlas debido a la optimización que el compilador quepa ahacer conforme al código que haya 'dejado' el programador, peor considerando las velocidades de procesamiento actual, no puede achacarse un tiempo de compilación diferente para cada caso (esto depende de la cantidad de código más que nada). 
En línea

Danielㅤ


Desconectado Desconectado

Mensajes: 1.675


🔵🔵🔵🔵🔵🔵🔵


Ver Perfil
Re: Ayuda con recursividad
« Respuesta #4 en: 30 Mayo 2021, 22:11 pm »

Hola, la recursividad se puede entender como un ciclo/bucle, por ejemplo una función que se llame a si misma, es una función recursiva que puede usarse como un bucle while o for.


Saludos
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ayuda con recursividad
.NET (C#, VB.NET, ASP)
eagle17 2 3,269 Último mensaje 1 Marzo 2009, 10:29 am
por bitarray
ayuda recursividad
.NET (C#, VB.NET, ASP)
Choclito 2 2,710 Último mensaje 14 Mayo 2009, 03:38 am
por Choclito
Ayuda con Recursividad
.NET (C#, VB.NET, ASP)
40 3 2,429 Último mensaje 14 Septiembre 2015, 18:19 pm
por DarK_FirefoX
Ayuda recursividad « 1 2 »
Programación C/C++
JUHC 10 9,666 Último mensaje 8 Agosto 2016, 16:41 pm
por AlbertoBSD
AYUDA CON RECURSIVIDAD « 1 2 »
Programación C/C++
alpachino98 11 5,044 Último mensaje 7 Febrero 2018, 15:08 pm
por dijsktra
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines