Usar una función una dentro de otra

Metaconta 66 Puntos de reputación
2024-08-30T23:36:47.4266667+00:00

Se desborda la pila por 5380 veces la pila de llamada, a veces 5376, otras veces por 5375, nunca igual.

Como puedes ver, e() llama a a() sin terminar el proceso e(), se crea la recursividad y por eso nunca acaba hasta que se desborde.

Tengo una pregunta.

Como e() nunca acaba su función porque dentro llama a a(). ¿Hay alguna manera de que termine de forma limpia dicha función e()?

Mi idea es que si llamo a e() y dentro tengo a a(), nunca acabará el e(). Lo malo de la función, que debe terminar el proceso o función antes de empezar otra.

Si uso goto, no tendré problemas de memoria de pila. Lo malo que el goto, crea malas prácticas de programación, por eso mejor no usarlo.

Si domino esto, podré hacer bien programas de consolas como este que puedes ver en el vídeo, llamar ventanas desde otras ventanas sin tener problemas de pila.

Ahí está el dilema.

Ver vídeo.

Código en C#:

using System;

namespace Pila_de_llamadas_Consola_01
{
    internal class Program
    {
        static void e()
        {
            a();
        }
        static void d()
        { // Aquí.
        }

        static void c()
        {
        }

        static void b()
        {
            c();
            d();
            e();
        }

        static void a()
        {
            b();
        }

        static void Main(string[] args)
        {
            a();
        }
    }
}
Sin supervisión
Sin supervisión
Etiqueta no supervisada por Microsoft.
215 preguntas
0 comentarios No hay comentarios
{count} votos

4 respuestas

Ordenar por: Muy útil
  1. Jonathan Pereira Castillo 9,260 Puntos de reputación Proveedor de Microsoft
    2024-09-04T15:02:43.8733333+00:00

    Hola Metaconta.

    ¡Bienvenido a Preguntas y respuestas de Microsoft!

    Código no está estrictamente soportado, habiendo dicho esto déjame intentar ayudarte con un extra milla.

    Entiendo tu dilema con la recursividad y el desbordamiento de pila. La recursividad puede ser poderosa, pero también puede llevar a problemas si no se maneja adecuadamente. Aquí hay algunas sugerencias para evitar el desbordamiento de pila y asegurar que las funciones terminen de manera limpia:

    1. Usar una condición de terminación: Asegúrate de que cada función recursiva tenga una condición de terminación clara para evitar llamadas infinitas. Por ejemplo:
    using System;
    namespace Pila_de_llamadas_Consola_01
    {
        internal class Program
        {
            static int counter = 0;
            static int maxCalls = 10; // Limitar el número de llamadas recursivas
            static void e()
            {
                if (counter < maxCalls)
                {
                    counter++;
                    a();
                }
            }
            static void d()
            { 
                // Aquí.
            }
            static void c()
            {
            }
            static void b()
            {
                c();
                d();
                e();
            }
            static void a()
            {
                b();
            }
            static void Main(string[] args)
            {
                a();
            }
        }
    }
    
    

    Evitar la recursividad innecesaria: Si puedes reestructurar tu código para evitar la recursividad, hazlo. A veces, un bucle puede ser una mejor opción.

    1. Usar una pila explícita: En lugar de depender de la pila de llamadas del sistema, puedes usar tu propia estructura de datos para manejar las llamadas de función. Esto te da más control sobre el flujo del programa y puede ayudar a evitar desbordamientos.
    2. Optimización de tail-call: Algunos lenguajes y compiladores optimizan las llamadas recursivas de cola para evitar el desbordamiento de pila. Aunque C# no lo hace automáticamente, puedes intentar reestructurar tu código para aprovechar esta técnica en otros lenguajes que sí lo soporten.

    ¡Espero que estos consejos ayuden a resolver el problema! Si necesitas más ayuda, estoy a tu disposición.

    Saludos

    Jonathan.


    Si considera que la información proporcionada anteriormente ha resuelto su consulta, le agradeceríamos que la marcara como “Aceptar la respuesta si te resulta útil”. Esto nos ayuda a mantener la calidad y relevancia de las soluciones en nuestro foro.

    0 comentarios No hay comentarios

  2. Jonathan Pereira Castillo 9,260 Puntos de reputación Proveedor de Microsoft
    2024-10-17T18:27:03.39+00:00

    Hola Metaconta.,

    El propósito de este mensaje es verificar la información proporcionada. Si tienes más actualizaciones sobre este tema, no dudes en responder en este mismo hilo.

    Respetuosamente,

    Jonathan

    0 comentarios No hay comentarios

  3. Jonathan Pereira Castillo 9,260 Puntos de reputación Proveedor de Microsoft
    2024-10-22T23:59:27.22+00:00

    Buenos día Metaconta.,

    Conforme a la información previamente proporcionada, el objetivo de este mensaje es verificar la misma. Si tienes nuevas actualizaciones relacionadas con este asunto, por favor, siéntete libre de responder en este mismo hilo.

    Atentamente,

    Jonathan

    -----------

    Tu opinión es muy importante para nosotros! Si esta respuesta resolvió tu consulta, por favor haz clic en ‘Sí’. Esto nos ayuda a mejorar continuamente la calidad y relevancia de nuestras soluciones. ¡Gracias por tu colaboración!

    0 comentarios No hay comentarios

  4. Jonathan Pereira Castillo 9,260 Puntos de reputación Proveedor de Microsoft
    2024-10-24T20:26:51.0566667+00:00

    Dado que no hemos recibido una respuesta de su parte, procederemos a cerrar este hilo de discusión. Sin embargo, queremos recordarle que tiene la libertad de abrir un nuevo hilo en nuestro foro en cualquier momento si necesita más asistencia o desea continuar la conversación.

    Tu opinión es muy importante para nosotros! Si esta respuesta resolvió tu consulta, por favor haz clic en ‘Sí’. Esto nos ayuda a mejorar continuamente la calidad y relevancia de nuestras soluciones. ¡Gracias por tu colaboración!

    Gracias por su participación y esperamos seguir siendo de ayuda en el futuro.

    Jonathan

    0 comentarios No hay comentarios

Su respuesta

Las respuestas se pueden marcar como respuestas aceptadas por el autor de la pregunta, lo que ayuda a los usuarios a conocer la respuesta que resolvió el problema del autor.