Perfilado de sección

    • Recursividad y Manejo de Memoria Dinámica

      Pilas, heaps, garbage collection y gramáticas formales.

    • Hasta esta semana, casi todos nuestros algoritmos han sido iterativos: una secuencia de instrucciones, eventualmente repetida con un while o un for, que avanza paso a paso hacia una solución. La iteración es una forma natural de pensar para la máquina —refleja directamente el ciclo fetch-decode-execute que estudiamos en la Semana 1— pero no siempre es la forma más natural de pensar para nosotros, ni la más clara para el lector del programa. Hay problemas cuya estructura es intrínsecamente recursiva: la respuesta para una entrada de tamaño n se define en términos de la respuesta para una entrada de tamaño menor. La recursividad es una técnica de diseño algorítmico en la que una función se define en términos de sí misma, aplicada a una entrada estrictamente más pequeña. Es una forma de pensar que se vuelve indispensable cuando los datos tienen estructura jerárquica (árboles, expresiones aritméticas, sistemas de archivos), cuando el problema admite la estrategia divide y vencerás (Semana 6), o cuando la definición matemática del problema es en sí misma recursiva.

      El segundo tema de la semana es la memoria dinámica. En la Semana 7 vimos que los objetos de Python viven en el heap; lo que no discutimos allí fue quién los libera cuando ya no se usan. En lenguajes como C o C++ esa responsabilidad recae sobre el programador. Python —como Java, C# o Go— ofrece un garbage collector: un mecanismo automático que detecta los objetos sin referencias activas y los elimina sin intervención del programador. Comprender cómo funciona el GC de Python es importante por dos razones: explica por qué ciertas prácticas (como las referencias circulares) pueden tener consecuencias sutiles, y nos prepara para apreciar el costo y el diseño de los lenguajes que sí nos hacen liberar la memoria a mano.

      Cerramos con una conexión holística que retoma directamente la naturaleza recursiva: las gramáticas formales. Los lenguajes de programación se describen mediante reglas recursivas (BNF, EBNF), y los compiladores e intérpretes que estudiamos en la Semana 6 construyen árboles de derivación aplicando esas reglas. Veremos que el código Python que escribimos es procesado por un programa —el parser de CPython— cuya tarea es esencialmente recursiva.

    • Los problemas de esta semana introducen la recursividad como técnica de diseño algorítmico, su análisis comparado con la iteración, los límites prácticos que impone la pila de ejecución y la aplicación natural de la recursividad al recorrido de estructuras jerárquicas. El eje temático es el patrón caso base + caso recursivo: una función se define en términos de sí misma aplicada a una entrada estrictamente más pequeña, hasta que la entrada llega al caso base que se resuelve directamente. Sobre esa base se construye la discusión de cuándo conviene la recursividad: cuando el problema admite una formulación divide-y-vencerás (Torres de Hanói, búsqueda binaria) o cuando los datos tienen estructura intrínsecamente jerárquica (archivos con directorios anidados, expresiones aritméticas, gramáticas).

      Las funciones recursivas establecen su caso base como el primer bloque del cuerpo: la disciplina de poner el caso base antes que el caso recursivo no es estética, evita el RecursionError que se produce cuando un caso base mal escrito nunca se alcanza.

    • Bienvenido al cuestionario de autoevaluación de la Semana 9. Este cuestionario está diseñado para que verifiques, en privado, tu comprensión de los temas presentados en el documento teórico Recursividad y manejo de memoria dinámica: recursión y su anatomía, pila de ejecución, árbol de recursión, criterios para elegir entre iteración y recursión, patrones canónicos, recursividad de cola y la política de Python, RecursionError, modelo de memoria del proceso, los tres pecados capitales del manejo manual del heap, el recolector de basura de Python, y gramáticas formales con árboles de derivación.

      Cómo se rinde

      El cuestionario consta de 30 preguntas de elección múltiple. Algunas tienen una sola opción válida; otras, dos, tres o hasta cuatro. Antes de marcar, es indispensable leer cuidadosamente todas las opciones.

      Sistema de puntaje

      Cada opción válida marcada suma puntos (cuanto menor sea el número de válidas, mayor su valor individual: +100% si hay solo una, +50% si hay dos, +33% si hay tres, +25% si hay cuatro). Cada opción inválida marcada descuenta puntos por la mitad del valor de una válida individual de esa misma pregunta. Por eso conviene seleccionar solo las opciones de las que se está razonablemente seguro: marcar al azar reduce el puntaje, no lo aumenta.

       

      El puntaje mínimo de cada pregunta es 0; no se acumulan valores negativos al final del cuestionario.

       

      Intentos y tiempo

      Tienes intentos ilimitados durante el período en que el cuestionario está abierto. Moodle conservará el mejor puntaje obtenido. No hay límite de tiempo por intento: puedes pausar y reanudar cuando lo necesites.

       

      Recomendaciones pedagógicas

      1. Lee primero el documento teórico completo y asegúrate de comprender los conceptos antes de empezar el cuestionario. La autoevaluación es para verificar comprensión, no para descubrirla.

      2. Practica el ciclo: intento → revisión → reintento. En el primer intento, intenta responder con honestidad. Después, revisa cuidadosamente la retroalimentación de cada opción (incluso de las que acertaste) para detectar dudas o malentendidos antes de reintentar.

      3. Cuando una pregunta te genere dudas persistentes incluso después de revisar la retroalimentación, llévala al foro de la materia indicando el número de pregunta (por ejemplo, S9-12) y la opción específica que te resulta confusa.

       

      El cuestionario no contribuye a la nota final del curso. Su valor es exclusivamente formativo: te ayuda a identificar dónde necesitas profundizar. El cierre para completarlo es el 18 de mayo a las 23:59.