¿Cuál es la mejor manera de enseñar recursividad a los estudiantes de programación introductoria?

Ya sea

  1. El pequeño intrigante
  2. Hazlo simple, comenzando con las funciones y avanzando.

El pequeño intrigante

Uno de los mejores libros educativos jamás escritos. Todo lo que necesita hacer es dar a cada alumno un intérprete de esquema y luego guiarlo por la mayor parte de este libro con el que cree que se sentirán cómodos (probablemente no debería ir tan lejos como el Y-combinator a menos que tenga una clase de alta calidad) ), ayudándoles a pensar las preguntas. Ni siquiera tiene que enseñarles el Esquema, ya que el libro les presenta gradualmente la cantidad de lenguaje que necesitan para el problema particular que están resolviendo.

El libro es muy accesible y adopta un enfoque narrativo discursivo. Comienza con funciones simples e introduce suavemente conceptos más complejos, luego muestra cómo combinarlos para hacer cosas aún más complejas. En el camino, los estudiantes aprenden

  • Cómo extraer un principio general de soluciones específicas y convertirlo en una función
  • Composición de la función
  • Funciones de orden superior
  • Recursividad

La recursión se introduce bastante temprano y se usa para problemas cada vez más complejos.

Si no tiene la opción de este enfoque o desea crear sus propios materiales originales del curso, entonces

Mantenlo simple

No hagas una gran cosa al respecto. No hay necesidad de asustar a los estudiantes: la recursión no es realmente difícil.

No comiences enseñándoles sobre los marcos de la pila, no te preocupes por volar la pila o el TCO o nada de eso. Esos detalles pueden venir después.

Su elección del idioma no es realmente importante para enseñar los conceptos básicos de la recursividad. Debe soportar funciones de primera clase.

  1. Comience con funciones. Haz que escriban funciones simples. Haga las funciones referencialmente transparentes. No tiene que contarles sobre la transparencia referencial, solo use ese tipo de función en la enseñanza. Las funciones recursivas que usan un estado externo mutable son desordenadas y solo confundirán la enseñanza en este punto.
  2. Pasar a tener funciones llamar a otras funciones. En esta etapa, asegúrese de que entiendan el alcance, la visibilidad y la vida útil de las variables. Si aún no han aprendido esos conceptos, ahora es el momento de enseñarles. Haga que comprendan, por ejemplo y escribiendo sus propias funciones, que no importa si los parámetros o las variables locales de una función tienen los mismos nombres que los de otra función, incluso si la primera función llama a la segunda.
  3. Ahora no debería ser demasiado difícil enseñar una recursión simple, que es solo un caso especial de llamar a una función desde otra función. Comenzaría estableciendo desafíos simples basados ​​en listas vinculadas (la estructura de datos recursiva más simple). Problemas como calcular la longitud de la lista, agregar todos los números en una lista, encontrar el número más grande en una lista.
  4. A continuación, pasaría a simples recorridos de árboles binarios. Esa es otra estructura recursiva simple. No debería ser difícil hacer que los estudiantes vean que cualquier parte del árbol es en sí mismo un árbol. Comprender cómo sumar recursivamente todos los números en un árbol puede ser más fácil para los estudiantes que con una lista vinculada. Hacer que encuentren el mayor número en el árbol no es mucho más difícil. Hacer que encuentren la profundidad del árbol será más difícil.
  5. Ahora, después de haberles enseñado a atravesar estas estructuras simples para hacer cosas específicas, repasar sus soluciones y hacer que vean cuántas de ellas son similares, solo que difieren en lo que calculan en cada iteración. Enséñeles a escribir una función genérica para iterar sobre una lista, una función que toma otra función como parámetro y aplica esa función en cada iteración. En otras palabras, enséñeles a escribir pliegues, reducciones y recorridos. Enséñeles a hacerlo también para el árbol binario.
  6. Para llevar a casa las lecciones del punto anterior, pídales que escriban su lista genérica y las funciones de recorrido del árbol para que, dada una función específica f , la lista y los recorridos del árbol hagan lo mismo. Entonces, si tiene una función que compara dos números y devuelve el mayor, tanto la lista como los recorridos en árbol, dada esa función y una estructura para recorrer, devolverán el número más grande en la estructura.

Si los ha llegado hasta aquí, ya han aprendido mucho más de lo que muchos desarrolladores aprenden (dado el triste estado de la educación CS y las actitudes conservadoras de una parte de la industria). Cosas que podrías explicar:

  • Cómo usar la recursividad para implementar un ciclo for / while más tradicional (cosas de niños para ellos, en este punto)
  • Recursión mutua (por ejemplo, escribir funciones isOdd? E isEven? Que funcionan llamándose entre sí)
  • La mecánica de los marcos de pila, qué es la recursión de cola.
  • Desafíos más complejos como el algoritmo de ruta más corta de Dijkstra.
  • Combinadores de punto fijo

En este punto, su elección de idioma se vuelve más significativa.