lunes, 14 de diciembre de 2015

10. ¿Algorítmica, estás ahí?

Los recorridos como herramienta conceptual.


  Una pregunta muy importante cuando pensamos en un curso inicial de programación es ¿cuánta algorítmica tenemos que incluir en el mismo?
Si incluímos demasiada, corremos el riesgo de que el estudiante se atore (después de todo, los algoritmos son un concepto abstracto), pero si no incluimos ninguna se torna compleja la resolución de problemas que no sean prácticamente triviales.

  Recordemos que, el objetivo de un curso inicial de programación, es llevar al estudiante de una forma concreta de pensamiento a una forma abstracta. Consecuentemente, sería deseable que los primeros conceptos algorítmicos sean lo más "concretos" posibles, y que puedan complejizarse con el tiempo.
Nuestra propuesta sigue la línea del curso de Jean Pierre Peyrin [SP88] y sus "máquinas" (máquina de caracteres, máquina de registros, etc.): utilizar el recorrido de secuencia de elementos, comenzando con secuencias muy concretas y aumentando el nivel de abstracción con cada ejemplo.

  En el enfoque didáctico Gobstones llamamos *recorrido* a una forma algorítmica de tratamiento de secuencias de elementos. Un recorrido es, entonces, una forma de dividir el problema del tratamiento de la secuencia en subtareas específicas, de manera tal que todos los elementos sean procesados exactamente una vez, en orden y sin olvidar ninguno.
Las subtareas identificables en un recorrido son:
  • Iniciar el recorrido: identificar la secuencia y preparar lo necesario para realizar el recorrido, por ejemplo, posicionándose en el 1er elemento.
  • Verificación de finalización: pregunta que indica si aún quedan elementos sin procesar.
  • Procesamiento de un elemento: tarea a realizar con cada uno de los elementos de la secuencia.
  • Avanzar en la secuencia: tarea a realizar para considerar el siguiente elemento de la secuencia, si es que el mismo existe.
  • Finalizar el recorrido: actividad que puede variar desde el tratamiento del último elemento por separado, la restauración de condiciones alteradas durante el procesamiento, o la devolución de la información final solicitada.
Así, un recorrido tendrá el siguiente aspecto en el código:

procedure RecorridoGenerico()
{
   IniciarRecorrido()
   while (not finDeRecorrido())
    {
      ProcesarElementoActual()
      AvanzarAlSiguienteElemento()
     }
    FinalizarRecorrido()
}

Además, podemos entender al recorrido como una manera de utilizar la repetición condicional de manera tal que no se produzcan situaciones no deseadas de no terminación.

  Es fundamental que los primeros recorridos sean los más concretos posibles. Nuestra propuesta es que los elementos a recorrer en los primeros ejemplos sean las celdas de una fila o una columna, puesto que son elementos contiguos y consecutivos, y el tablero es percibido como un elemento concreto. (Por ejemplo, plantar una flor en cada una de las celdas de una fila).
A medida que se avanza en el curso, los recorridos pueden complejizarse: se pueden recorrer todas las celdas del tablero, y luego celdas que no necesariamente estén contiguas o consecutivas ("caminos" con curvas, solo celdas que tienen bolitas rojas, etc.), recorridos con un propósito particular (encontrar un elemento, o totalizar cierta información), hasta considerar, si el tiempo y el nivel deseado para el curso lo ameritan, recorridos donde la noción de siguiente elemento puede ser muy compleja o abstracta (por ejemplo, un laberinto con múltiples bifurcaciones), o, si el curso continúa con estructuras de datos, trabajar con secuencias representadas de esta forma (mediante listas).

  La experiencia utilizando la didáctica Gobstones nos ha mostrado que en general la noción de recorrido es de fácil adquisición cuando se presenta en forma concreta, y se va dificultando su comprensión a medida que se vuelve más abstracta, por lo que estamos convencidos de que la propuesta es adecuada. Otras formas algorítmicas más complejas (por ejemplo, recursión, recorridos en profundidad, etc.) son demasiado abstractas y es nuestro consejo que queden para cursos posteriores.

  El hecho de identificar a los recorridos como una herramienta útil para estructurar una estrategia de solución es un elemento de la didáctica Gobstones que creemos aporta muchísimo a la hora de enseñar programación con un enfoque gradual desde lo concreto a lo abstracto. Es otro de los elementos de Gobstones que deben considerarse fundamentales en este enfoque didáctico.

[SP88] P.C. Scholl and J.P. Peyrin. Schémas algorithmiques fondamentaux: séquences et itération. Université Joseph Fourier Institut Grenoblois d’études informatiques, 1988