Planificación de Sucesiones Algebraicas y Geométricas.

Introducción

MateFun es un lenguaje de programación funcional elaborado por un grupo de investigadores del Instituto de Computación de la Facultad de Ingeniería de la Universidad de la República. Dicho lenguaje está dirigido al aprendizaje de funciones matemáticas a nivel secundario y es de acceso web, es decir, permite un trabajo en línea con la herramienta de trabajo. 

Si bien esta plataforma, con el lenguaje MateFun, permite trabajar tanto con una visión gráfica 2D o 3D, en esta oportunidad nos proponemos centrarnos en la parte de la herramienta que se adaptan más a los objetivos que nos planteamos en el curso respecto al tema de sucesiones algebraicas. Es importante destacar que nuestro vínculo con los estudiantes es a partir de la enseñanza de la matemática y que programar es debe servir de herramienta en este sentido por lo que entendemos que no es necesario abordar todas las posibilidades que brinda MateFun. Dicho esto, esto no significa que los estudiantes no puedan acceder a mayor información y desarrollar ellos mismos nuevas habilidades con la herramienta.

 

Se espera que los estudiantes aprendan algunos conceptos básicos de programación. Esto no es únicamente útil para los estudiantes que realizarán cursos de ingeniería en el futuro, ya que hoy en día todas las ciencias están utilizando distintos elementos computacionales para realizar sus investigaciones. Entendemos que un ciudadano tiene que ser capaz de entender, cuestionar y participar en la sociedad en que vivimos, por lo que esta puede ser una herramienta importante en la formación de los futuros ciudadanos. Por último, recordar que el mismo programa de Matemática CT, curso en el que trabajaremos, recomienda trabajar con lenguajes de programación como Python para trabajar conceptos de divisibilidad. Entendemos mucho más acorde para este curso, como primera aproximación a la programación, trabajar con MateFun en lugar de Python, que es un lenguaje más exigente, así como tampoco trabajar con divisibilidad, ya que empezar con sucesiones puede facilitar el uso de algoritmos. Uno de los motivos fundamentales es que, a diferencia de MateFun, Python no requiere trabajar con el dominio de la función. Esta diferencia es de suma relevancia ya que la intención de utilizar la programación en las clases de matemática es que los estudiantes aprendan matemática. Evidenciar los conceptos es uno de los objetivos que nos planteamos.  

Soluciones computacionales

Este trabajo se enmarca en el contexto del proyecto de investigación  “Espacios de investigación didáctica en el área de matemática y computación”, financiado por la Comisión Sectorial de Investigación Científica de la UDELAR,  llevado adelante por investigadores en didácticas específicas y en informática, con participación de  SEMUR. La etapa inicial del proyecto incluyó el estudio y la discusión sobre los siguientes pasos a seguir para construir una solución computacional de un problema algorítmico, en los cuales se basa este trabajo para la planificación de las actividades:

Los pasos del modelado matemático y computacional son las siguientes:

  1. “Entender el problema” significa expresar el enunciado como problema algorítmico: datos de entrada y datos de salida en función de los de entrada. El enunciado puede referirse a un problema concreto que se soluciona con una ecuación o a un caso general que se soluciona con una función.
  2. “Diseñar un algoritmo” significa diseñar una solución algorítmica y expresarla como función matemática. Una solución algorítmica se diseña teniendo en cuenta que va a ser programada.
  3. “Escribir un programa” significa escribir el algoritmo diseñado en el paso 2 en un lenguaje de programación (en nuestro caso Matefun).
  4. “Ejecutar el programa”  significa ejecutar el programa y corregir eventuales errores y/o mejorar la solución algorítmica.

En definitiva, los pasos 1 y 2 corresponden a una solución matemática, mientras que los pasos 3 y 4 hacen referencia a una solución computacional.

Algo fundamental es tener claro que entender el problema implica poder expresar una relación entre los datos que se esperan introducir en el programa y los datos que se espera que este retorne. Esta decisión no siempre es clara y tiene consecuencias directas en el programa las decisiones que toma el estudiante a la hora de escribir un programa cualquiera.

Entiendo que es importante en este punto aclarar que el objetivo sigue siendo enseñar matemática, y en particular sucesiones algebraicas. En ese sentido, tomamos la definición de Schoenfeld (1992) que es posible considerar el conocimiento matemático como un conjunto de hechos y procedimientos relacionados con cantidades, magnitudes y formas, y la relación que existe entre las mismas. Por otro lado, la matemática puede ser conceptualizada como una ciencia de patrones (P.334-335).

En esta línea, la matemática es una actividad social donde el lugar donde se practica (la comunidad en donde se desarrolla, genera acuerdos y se validan argumentos) juega un lugar central. “Aprender a pensar matemáticamente significa (a) desarrollar un punto de vista matemático que valide procesos de matematización y abstracción generando una predisposición a usar dicho conocimiento, y (b) desarrollar competencias con dichas herramientas de trabajo y utilizarlas al servicio del objetivo de entender mejor la estructura matemática” (Schoenfeld, 1992, P.335).

En este sentido, MateFun es una oportunidad para que los estudiantes utilicen las herramientas matemáticas que conocen con el objetivo de que la computadora realice los procedimientos que ellos entiendan que debe hacer. Esto le brinda a los estudiantes la posibilidad de desarrollar, cuestionar y construir estructuras matemáticas más sólidas, generando un sentido distinto al habitual y haciendo que la generación del conocimiento sea más significativa para el estudiante. 

Dinámica de clase

El curso en el que se desarrolló la propuesta fue Matemática CT, que es la matemática específica a la orientación ciencia y tecnología de segundo año de bachillerato (2EMS). Antiguamente esta orientación, y gran parte de los contenidos que se trabajan estaban en la Matemática 2 de la orientación científico de quinto de bachillerato.

El curso en cuestión cuenta con 4hs semanales repartidas en dos días. A su vez, una de las dos sesiones de dos horas se dispone del profesor adjunto. En las clases donde se disponen de dos profesores se trabajó con Matefun, mientras que las otras dos horas se destinaron a introducir y profundizar contenidos matemáticos que se utilizarían (o no) a la hora de trabajar con Matefun.

Dicho esto, se pensaban destinar a esta dinámica cuatro encuentros durante cuatro semanas, pero la pérdida de continuidad por diversos motivos hizo que se reduzca a tres sesiones esparcidas en un poco más de 5 semanas. Esto perjudicó la continuidad del trabajo forzando a tener que reiniciar y recordar el trabajo realizado por los estudiantes. 

La intención era que los estudiantes trajeran las computadoras, y se realizó un sondeo donde la mitad de los estudiantes se ofrecieron a traer un dispositivo. Esto no fue necesario ya que el liceo cuenta con una cantidad importante de ceibalitas a disposición. Es importante destacar que se buscó que los estudiantes no trabajen solos, sino que se formen equipos de dos o tres estudiantes. 

Los materiales para cada encuentro se publicaron en la plataforma CREA, medio habitual de intercambio entre estudiantes y docentes. A través de esta plataforma se comparte habitualmente tanto material elaborado por los docentes del curso —ya sea teórico o práctico— como otros recursos complementarios, tales como enlaces a sitios web u otros contenidos relevantes para el desarrollo del curso.

En dicha plataforma se creó un foro donde los estudiantes comparten su material producido y dejan un registro del mismo. Es importante destacar que los estudiantes entraron a MateFun como invitados, por lo que dicho foro sirvió también para guardar lo producido.

Primer acercamiento

Es claro que el primer acercamiento de los estudiantes con un lenguaje de programación debe ser con la computadora delante. Sin embargo, es necesario explicarles a los estudiantes qué es un programa y qué es un algoritmo.

Para esto presentamos en la pantalla el lenguaje de programación y mostramos ejemplos de uso. Es importante tener claro que no somos programadores, ni tenemos la formación para serlo, pero siempre intentaremos manejar la terminología correcta para trabajar en ese sentido. Es importante ser cuidadosos con el lenguaje que utilizamos y los conceptos computacionales que utilicemos.

Las definiciones que utilizamos son las siguientes:

Un problema algorítmico es un conjunto de datos de entrada y un conjunto de datos de salida en función de los datos de entrada. Un algoritmo es una función que soluciona el problema (David Harel).

Los problemas algorítmicos,presentan soluciones algorítmicas que pueden ser programables, es decir, se puede escribir la solución del problema  en un lenguaje que la computadora pueda ejecutar. Estos textos ejecutables suelen llamarse programas.

Al definir un problema algorítmico recordaremos la definición de función que los estudiantes conocen ya que es la que trabajaron en clase. 

Definición de Función

Dados dos conjuntos A y B, llamaremos funciónde A en B (Lo anotamos:  f:ABf : A \rightarrow B ) a toda relación en la que todo elemento de A tiene un único correspondiente en B, al que llamaremos imagen.

A es el DOMINIO de la función f y B es el CODOMINIO de la función f.

Definición de Función

Dados dos conjuntos A y B, llamaremos funciónde A en B (Lo anotamos:  f:ABf : A \rightarrow B ) a toda relación en la que todo elemento de A tiene un único correspondiente en B, al que llamaremos imagen.

A es el DOMINIO de la función f y B es el CODOMINIO de la función f.

Por ejemplo, si quiero calcular la media entre las edades de los estudiantes de la clase es un problema algorítmico que puede resolverse por medio de una función en donde la entrada son todas las edades de los estudiantes y la solución, o la imagen de la función, es el la media entre los distintos datos presentados. 

Un ejemplo más cercano puede ser para resolver una ecuación, por ejemplo 2x + 5 =15

Aquí tenemos que tener en cuenta que lo que buscamos es resolver una ecuación de primer grado, donde los datos de entrada pueden ser (2;5;15) y la función, o el programa en concreto, devuelva 5.

¿Puedo hacer lo mismo con cualquier ecuación de primer grado de coeficientes reales? La respuesta es sí. En caso de tener una ecuación de la forma ax + b = c los datos de entrada serían los números reales a, b, c y la respuesta esperada es el número real (cb)a\frac{(c-b)}{a}

Observamos que hasta aquí hemos seguido los tres primeros pasos de los cuatro mencionados arriba y que hay conceptos matemáticos que están sobreentendidos. Por ejemplo, identificar que es de primer grado es algo esperable por estudiantes de quinto año (a debe ser distinto de 0), así como qué significa restar b o dividir entre a. Está claro que es bueno reflexionar con los estudiantes sobre el procedimiento matemático, especialmente por la imagen conceptual que brindamos a los estudiantes. Sin embargo, para cumplir con el paso 4, esos sobreentendidos deben explicitarse porque para que la ejecución del programa no produzca el error de división por 0, éste debe quedar excluido del dominio de la función, como se muestra a continuación en MateFun:

  • ecPrimerGrado :: Rno0 X R X R -> R
  • ecPrimergrado(a,b,c) = (a – b) / c

Al escribir el programa, ejecutarlo y analizar el resultado cumplimos con los pasos para llegar a una solución computacional. Resumiendo:

1. “Entender el problema ” (el problema se expresa y se explicitan los datos de entrada y datos de salida).

2. “Diseñar un algoritmo” (se diseña una solución algorítmica que consiste en hacer las operaciones con los datos de entrada en determinado orden).

3. “Escribir un programa” (escribimos un programa por ejemplo en MateFun que tome tres reales a (no 0), b y c y devuelva (cb)a\frac{(c – b)}{a} ), como se muestra arriba).

4. “Ejecutar el programa” (se ejecuta el programa y se realizan pruebas para ver si se obtienen los resultados esperados o si se puede mejorar el programa).

La intención con esta introducción es que los estudiantes se familiaricen con el lenguaje mateFun sin presentar, en principio, un desafío complejo. Es claro que para muchos estudiantes esto puede resultar un desafío en sí, pero intentamos que se familiaricen de a poco presentando actividades más exigentes de manera progresiva intentando evitar frustraciones en el camino.

Lo importante es que las funcionalidades que vamos a intentar que los estudiantes utilicen en esta introducción son las que esperamos que los estudiantes necesiten a la hora de trabajar con las sucesiones. Esto significa que, aunque van a tener el manual completo para que los estudiantes que deseen puedan profundizar en un futuro, no se incluyó ninguna de las funcionalidades de presentación en 2D o 3D que ofrece MateFun. Esto no quita que un estudiante pueda sorprendernos con alguna propuesta, ya que van a tener el “manual” a su disposición y es una posibilidad que presentaría sus ventajas al ver los puntos aislados. Sin embargo, no es algo en lo que se planificó ya que se buscó centrar la atención de los estudiantes en la construcción de los programas para este tema.

Luego de introducir el concepto de problema algorítmico y de programas en términos generales, pasaremos a trabajar con el lenguaje Matefun. Para esto los estudiantes ingresan a la página online https://www.fing.edu.uy/proyectos/matefun/#/es/login e ingresan como invitados. Aquí debe, antes de empezar a trabajar, crear un archivo haciendo clic en el símbolo + y darle un nombre que empiece con mayúscula. Todos los estudiantes ingresaron como invitados, por lo que era fundamental que tengan claro que los archivos que crean online son temporales, es decir, no se guardarán de manera permanente. Si quisieran conservar lo que producen, deben descargarlo y volverlo a cargar o simplemente copiar y pegar lo producido en un archivo de texto. En concreto, se les solicitó que suban, más adelante, algunos trabajos en CREA.

También tenemos que tener claro que no fue una prioridad darle al comienzo de la actividad un manual de Matefun debido a que buscamos que los estudiantes estén atentos a las indicaciones que vamos realizando. Esto no quita que en el transcurso de la clase se les brinde el siguiente enlace donde encontrarán información relevante y detallada de cómo utilizar el lenguaje: https://matefun-docs-643244.pages.fing.edu.uy/. Los estudiantes podrán encontrar específicamente cómo definir un conjunto o una función de manera muy accesible al nivel que buscamos. Esto no quita que también encontrarán otras cuestiones relacionadas con el lenguaje y podrán explorar de manera autónoma las distintas posibilidades que ofrece. Volvemos a mencionar que en clase solo haremos hincapié en las funcionalidades necesarias para que los estudiantes puedan trabajar el objeto matemático que nos interesa enseñar, en este caso, sucesiones.

Luego de realizada esta aclaración, se creó un segundo programa junto con los estudiantes. El problema fue presentado por medio de un problema de contexto real. “Los ojitos cuestan $3 cada uno, ¿cuál es el costo si quiero comprar 5 ojitos? ¿Y si quiero comprar 200? ¿Y si quiero comprar n?” En concreto, se construyó un programa al que se le introduzce un número y que devuelva el triple. El programa en cuestión que esperamos que surja es el siguiente:

  • triple:: R -> R
  • triple(x) = 3*x

Aquí recordaremos que R es el conjunto de los números reales. Veremos que el nombre que se le da a la función dentro del programa hace referencia a lo que se le va a pedir después. Que hay una flecha igual que cuando trabajamos en el pizarrón, y que en definitiva lo que debe devolver es 3x, es decir, el tres por el número introducido por el usuario.

Un punto a considerar, es cómo explicar a los estudiantes lo que se puede observar cuando entran a la página de MateFun. Aquí se pueden ver dos ventanas (una blanca y otra negra). Esto se debe a que se trabaja con un Entorno de Desarrollo Interactivo. El programa se escribe en la ventana de la izquierda, y se carga con la tecla play. Si no hay errores, puede ejecutarse en la ventana de la derecha. y luego se ejecuta, luego de cargarse, en la ventana negra de la derecha. Para correr el programa hay que hacer clic en la tecla “play” y se pasa a trabajar en la pantalla de fondo negro. Ahí se introduce  “triple(5)”, ejecutando el programa para el dato 5, y el programa debe de devolver “15”.

También podemos construir un programa que devuelva el cuadrado de un número. El programa en cuestión se puede escribir de dos maneras. La primera sería la siguiente:  

  • cuad:: R -> R
  • cuad(x) = x*x

Mientras que la segunda sería:

  • cuad:: R -> R
  • cuad(x) = x^2

Ambos programas presentan dos algoritmos que solucionan el mismo problema, y por lo tanto a la misma entrada devuelven el mismo resultado como salida.. Más adelante se volverá a recordar este ejercicio para discutir. En clase nos limitamos a mostrar las dos alternativas y a que los estudiantes justifiquen la validez de los dos programas.

De la misma manera plantearemos que queremos un programa al cual le ingresemos un número natural y que nos devuelva su inverso. Aquí repasamos rápidamente el concepto de inverso, donde el inverso de 2 es ½, el de 3 es 1/3 y así sucesivamente. En este caso el dominio deja de ser R, e incluso no es Z.

También podemos construir un programa que devuelva el cuadrado de un número. El programa en cuestión se puede escribir de dos maneras. La primera sería la siguiente:  

  • cuad:: R -> R
  • cuad(x) = x*x

Mientras que la segunda sería:

  • cuad:: R -> R
  • cuad(x) = x^2

Ambos programas presentan dos algoritmos que solucionan el mismo problema, y por lo tanto a la misma entrada devuelven el mismo resultado como salida.. Más adelante se volverá a recordar este ejercicio para discutir. En clase nos limitamos a mostrar las dos alternativas y a que los estudiantes justifiquen la validez de los dos programas.

De la misma manera plantearemos que queremos un programa al cual le ingresemos un número natural y que nos devuelva su inverso. Aquí repasamos rápidamente el concepto de inverso, donde el inverso de 2 es ½, el de 3 es 1/3 y así sucesivamente. En este caso el dominio deja de ser R, e incluso no es Z.

Lo primero que destacaremos es que el lenguaje de programación que se está utilizando no contempla los números naturales, solo a R y a Z. Esto no es un problema ya que podemos definir N a partir de Z tomando los positivos y el cero, en definitiva, el conjunto N queda definido de la siguiente manera: conj N = {n en Z | n >= 0}.

Se espera que, en una primera instancia, los estudiantes reconocerán y escribirán el programa con dominio N, definiéndolo correctamente a partir de Z. Se les debe hacer notar que hay que modificar el dominio ya que no es posible dividir entre cero. En definitiva, se le pedirá a los estudiantes que prueben con distintos números y, en algún momento, se pedirá el inverso de cero. Aquí es importante detenerse en leer los errores que aparecen.

En el primer caso, el programa devuelve lo siguiente:

  • Error: {archivo: Introducci linea: 11 columna: 10}
  • Division por 0

La division es una funcion parcial, no esta definida para 0.

En definitiva, el programa que se espera escribir es el siguiente:

  • conj Nno0 = {x en Z | x > 0 }
  • inv:: Nno0 -> R
  • inv(x) = 1/x

La division es una funcion parcial, no esta definida para 0.

En definitiva, el programa que se espera escribir es el siguiente:

  • conj Nno0 = {x en Z | x > 0 }
  • inv:: Nno0 -> R
  • inv(x) = 1/x

Como último ejemplo, antes de que los estudiantes trabajen en su ejercicio, se trabajará en la idea de un programa donde se les brinden dos números naturales y nos devuelvan el resultado de realizar la división entre ellos dos. Es claro que la división es en R. En otro momento se podría trabajar para realizar la división en N encontrando cociente y resto pero eso, por el momento, excede lo que estamos buscando que es que los estudiantes se familiaricen con el programa.

Los estudiantes notarán que se deben introducir dos valores de entrada (m, n). Esto en matemáticas le llamamos par ordenado, donde m y n ocupan un orden y es un objeto matemático distinto a (n,m). Tenemos que destacar, más allá de que los estudiantes no necesariamente estén familiarizados con el término, que estamos hablando del producto cartesiano de N por N.  Para estos casos el dominio del algoritmo podría ser, en principio, N X N. Aquí es posible que surja el problema, nuevamente, de dividir entre cero. En caso de que no surja en este momento, seguiremos adelante y solucionaremos el problema cuando sea necesario, pero es claro que hay que definir un conjunto ya utilizado anteriormente llamado Nno0.

A continuación, los estudiantes trabajarán en los siguientes ejercicios. La idea es que los resuelvan solos, aunque es claro que los docentes estaremos recorriendo el salón tratando de evacuar dudas y ayudar a manejar el lenguaje MateFun ya que la sintaxis es una dificultad que esperábamos que tengan. Llama la atención que el uso del entorno de trabajo de MateFun no dio problema ninguno.

Actividad 1.

  1. Construye un programa donde proporciones como datos de entrada un número real y nos devuelva su potencia de tres.
  2. Construye un programa donde proporciones como datos de entrada el par (altura, ancho) y calcule el área del rectángulo.
  3. Construye un programa donde proporciones como datos de entrada el par (altura, ancho) y calcule el perímetro del rectángulo.
  4. Construye un programa donde proporciones como datos de entrada el par (altura, ancho) y calcule la medida de la diagonal del rectángulo.
  5. Construye un programa donde proporciones como datos de entrada el par (altura, ancho) y devuelva el área, el perímetro y la medida de la diagonal del rectángulo.

La parte a, es un programa sencillo, pero al ser el primer intento donde los estudiantes trabajan “solos” con el lenguaje y la computadora puede tener algunos inconvenientes importantes. Todos los estudiantes saben calcular un número al cubo, pero programarlo es interesante ya que los estudiantes van a encontrar que no existe un comando para elevar a la tres. Eso implica que el programa que podrían escribir finalmente sea el siguiente:

  • cubo:: R -> R
  • cubo(x) = x*x*x

Nuevamente, otra posibilidad es que los estudiantes presenten el siguiente programa:

  • cubo:: R -> R
  • cubo(x) = x^3

Aunque sea muy similar al programa anterior, aquí los estudiantes trabajan solos. Intentamos que ganen confianza en el uso de la herramienta y que puedan relacionar lo trabajado previamente con lo que deben realizar.

No es esperable, en este momento, que los estudiantes se planteen un problema utilizando la recursividad de la operación, o que se planteen qué pasaría si lo quiero elevar a un número no determinado previamente en el programa. Esta situación será un problema para abordar más adelante con los estudiantes. Sin embargo, insistimos en que es el primer acercamiento de los estudiantes y por lo tanto no debería surgir esta interrogante.

En la parte b los estudiantes se encuentran con el desafío de escribir un programa donde se pueda calcular el área de un rectángulo. Para esto hay que definir bien la entrada y la salida del programa. En el caso de la entrada estamos hablando de que necesitan dos números reales positivos, es decir, un par ordenado de reales positivos. Aunque ya se trabajó anteriormente, esta idea de par ordenado puede ser una dificultad a seguir trabajando con los estudiantes.

Se espera algo similar al siguiente programa:

En la segunda actividad, los estudiantes se enfrentan a un problema que es un poco más desafiante, pero que por su familiaridad debería resultar llamativo. En primer lugar, los estudiantes conocen la definición de potencia, más allá de que está bien que se lo recordemos. Sin embargo, el convertir dicha definición en un programa presenta una dificultad adicional debido a la necesidad de utilizar la recursividad en el mismo programa.

A diferencia de los programas anteriores, en este caso insistimos en que utilicen la definición de potencia. Es claro que podían simplemente escribir m^n y el algoritmo sería mucho más sencillo. Sin embargo, lo que queremos desarrollar es el concepto de recursividad.  En otras palabras, es necesario que el programa se invoque  a sí mismo para generar la retroactividad. Anteriormente, en el item “d” del ejercicio anterior, los estudiantes podían convocar a los subprogramas que ya habían construido. En este caso la construcción misma del programa es recursiva.

Otro punto a tener en cuenta es que aquí introducimos el “si”, en otras palabras, lo que estamos definiendo es una condición para pasar a tener una función definida por casos. Esto se podría introducir en algún ejercicio anterior, pero creo que es conveniente introducirlo en este punto. Claramente, los estudiantes necesitarán una ayuda especial para encontrar esta herramienta en el manual, cosa que ayudaremos e incentivaremos a que lo busquen.

El ejercicio en cuestión es el siguiente:

Actividad 2. Conocemos que cualquier calculadora nos puede brindar m^n (m elevado a la n), incluso MateFun puede hacerlo correctamente.

Recordemos que la definición formal realizada por recurrencia:

Construye un programa en MateFun donde introduzcas de entrada m y n y brinde, utilizando recurrencia, m elevado a la n.

El programa que esperamos que los estudiantes construyan es el siguiente:

Este es el primer acercamiento a la recursión, y es importante destacar que la función se invoca a sí misma, pero disminuyendo el valor pedido. La condición indica hasta dónde se debe disminuir ese valor y el caso base indica el resultado a devolver una vez que se llegó a ese valor límite. En este caso concreto, el caso base se da cuando n es 0, siendo el resultado 1. Esto se vuelve a trabajar en las siguientes actividades, ya que es una herramienta fundamental para desarrollar el pensamiento computacional. 

En la tercera actividad se espera que el estudiante muestre lo aprendido en las actividades anteriores. Sin embargo, se intentó que los estudiantes busquen la información que les falte ya que no les brindaremos la definición de factorial de un número y dudamos que los estudiantes estén familiarizados con el concepto.

Actividad 3.

  1. Realiza un programa en Matefun donde introduzcas un número natural (m) y te devuelva su factorial (m!).
  2. Construye un programa en Matefun donde introduzcas un número natural y devuelva la suma de todos los números de cero a dicho número.

En esta actividad, los estudiantes además deberán entender que solo se introduce un número y se debe operar de manera recursiva para devolver un resultado.  

El programa que se espera que realicen es el siguiente:

Un de los errores que cometieron los estudiantes fue  no notar que en el subprograma de suma de 1 a n no poner 0 en el caso que n sea igual a 0 y dejar el 1 al utilizar las mismas líneas que en la parte anterior de esta actividad.

Es interesante hacer notar a los estudiantes que si ponemos como dato de entrada números sumamente grandes, el programa se cuelga. De hecho, en este momento el programa se cuelga a partir del número 23. Esto es debido a que la computadora tiene un límite respecto al número de datos que puede procesar. Dicho límite puede considerarse sumamente elevado, pero es un límite. Es claro que eso depende de la computadora donde se corra el programa, y al ser online depende de dónde se corra el programa y no en la computadora en la que trabajen los estudiantes. Ahora bien, nuestro objetivo es que los estudiantes construyan los conocimientos de sucesión algebraica y sucesión geométrica, pero que además lo logren a partir de realizar programación utilizando Matefun.

Sucesiones algrebraicas

En la actividad 4 ya esperamos que los estudiantes manejen el concepto de sucesión debido a que fue trabajado en clases anteriores sin el uso de la computadora. Interesa especialmente empezar a trabajar con la programación para poder retomar estos conceptos y resignificarlos. 

La actividad en concreto que se les presentará será la siguiente:

Actividad 4.

  1. Dada la sucesión an=(2n2+1)n+1a_{n} = \frac {(2n^2 + 1)} {n+1} escribe un programa que informe el n-ésimo término de la sucesión.
  2. Escribe un programa que devuelva la suma de los primeros n-términos de la sucesión anterior.
  3. Inventa una serie aritmética y chequea que tu programa escrito en la parte b funciona correctamente.
  4. Escribe un programa que devuelva la suma de los números de la serie desde el número n al número m de la serie.

En la parte a se espera que los estudiantes realicen un programa similar al siguiente:

  • conj Nno0 = {n en Z | n>0}
  • — nesimo valor de la a_n
  • an :: Nno0 -> R
  • an (n)= (2*n*n+1)/(n-1)

De esta manera, cuando corren el programa y ponen an(5) el programa devuelve a5a_{5}, es decir, nos devuelve 12,7500. Esto es correcto, pero en algún momento pediremos que sustituyan n por 1 y obtendrían el siguiente error:

  • Error: {archivo: Actividad4 linea: 5 columna: 9}
  • Division por 0

La division es una funcion parcial, no esta definida para 0.

En este caso, la sucesión que se les proporcionó a los estudiantes no está definida en cero y hay que tener cuidado a la hora de trabajar con ella.  Aunque introducimos un número natural, y al igual que mencionamos anteriormente, no es posible dividir entre cero ya que la división no está definida y el programa nos avisa el motivo por el cual no nos va a brindar la respuesta. Es claro que esperábamos que los estudiantes notaran esto debido a que se trabajó previamente. Los estudiantes no tuvieron problema posteriormente en modificar el dominio de la función para corregirlo. 

En la parte b, es posible que los estudiantes pretendan usar la fórmula para calcular la suma de los n primeros términos de una sucesión aritmética o geométrica, que es Sn=(a1+an)n2S_{n} = \frac{(a_{1} + a_{n}) n}{2}  . Sin embargo, esto es un error ya que esta sucesión:

  • no es aritmética (no tiene diferencia constante)
  • no es geométrica (no tiene razón constante)

Este ejercicio presenta un caso de sucesión definida por una fórmula racional en n para la cual no sirve usar la fórmula de la suma,  buscando que los estudiantes experimenten que no todas las sucesiones son iguales y que el primer paso “entender el problema” consiste en analizarlo y no caer en usar fórmulas en forma automática.

Adicionalmente, una ventaja de trabajar con sucesiones no aritmética o geométrica es que los estudiantes están obligados a trabajar con la recursividad, y este es un punto importante para trabajar en programación.

  • — suma n primeros terminos
  • suma:: Nno0 -> R
  • suma(n) = an(n) + suma(n-1) si n>2 o an(n)

Algo interesante a observar es que en el programa que prevemos que los estudiantes pueden formular, pusimos n>2. En realidad, lo que se espera es que los estudiantes introduzcan un 1 ya que sería el último término de la sucesión. Esto conduciría nuevamente a dividir entre cero y volvería a aparecer el error que mencionamos anteriormente. En este caso, no podemos obviar el problema y tenemos que introducir la condición de que n sea mayor a 2 ya que, en caso contrario, el programa siempre devolvería el mismo error ya que intentaría dividir entre cero al tratar de calcular an(1). Una alternativa es que el dominio de la función debería excluir este caso. Esto es relevante especialmente ya que muestra que si los estudiantes manejan estas opciones, significa que están generando un conocimiento matemático y de programación. Estas preguntas surgieron en algunos grupos, pero no en todos los casos.  

En la parte c del ejercicio buscamos que los estudiantes se animen a escribir su propia sucesión y puedan a partir de ahí seguir trabajando con las demás partes. Algo interesante sería pedirles que busquen en el repartido de matemáticas alguna que ya hayan trabajado anteriormente en algún ejercicio y traten de chequear o testear si trabajaron correctamente.  Esta “libertad” que les damos a los estudiantes busca que los estudiantes trabajen de forma autónoma. No se espera que lo hagan enseguida, sino que es algo a fomentar por parte nuestra.

El último programa solicitado busca que los estudiantes utilicen el programa anterior que escribieron. La idea es utilizarlo como herramienta auxiliar para calcular la suma de n a m valores calculando previamente la suma de uno a n, la suma de uno a m, y luego calcular la diferencia entre ambas para tener la suma de m a n.

En definitiva, el programa que esperamos es el siguiente:

  • deman:: Nno0 X Nno0 -> R
  • deman(m,n)= suma(n) – suma(m)

La siguiente actividad busca evaluar a los estudiantes. Para esto mandaremos la tarea domiciliaria y esperaremos los resultados. La principal ventaja de realizarla de manera domiciliaria es que los estudiantes pueden consultar los materiales que deseen, pero sobre todo porque no se sentirían limitados por el tiempo de clase.

Actividad 5.

  1. Queremos generalizar para escribir un programa que trabaje con todas las sucesiones aritméticas. Es decir, que le demos al programa los elementos de la sucesión aritmética, así como un valor de n específico, y nos devuelva ana_{n}.En definitiva, escribe un programa donde ingreses a1a_{1}, d y n y devuelva an.a_{n}.
  2. Escribe un programa donde ingreses a1a_{1} , d y un valor n y devuelva la suma de todos los términos de a1a_{1}a ana_{n}
  3. Escribe un programa donde ingreses a1a_{1} , d y los números m y n, y devuelva la suma de todos los términos de ama_{m} a ana_{n}.
  4. Escribe un programa al cual le ingreses el n-esimo valor, y el m-esimo valor de una sucesión aritmética y devuelva el primer valor de la sucesión y la diferencia. (Entrada: an,n,am,ma_{n}, n, a_{m}, m)

En la parte a, los estudiantes deben entender que los elementos de una sucesión algebraica son a1,da_{1} , d y n, y que estos definen a an.a_{n}. En definitiva an=a1+dna_{n} = a_{1} + dn . La dificultad que esperamos es definir bien el dominio de la función. El programa que se espera es el siguiente.

  • suc:: N X Nno0 X Nno0 -> R
  • suc (a, d, n) = a + d*n

En la parte b, se espera que ahora si los estudiantes utilicen la fórmula Sn=(a1+an)n2S_{n} = \frac{(a_{1} + a_{n}) n} {2}, aunque si utilizan nuevamente la recursión también estaría bien.

En concreto, el programa que esperamos que escriban es el siguiente:

  • sum:: N X Nno0 X Nno0 -> R
  • sum (a, d, n) = (a + suc(a,d,n))*n/2

En la parte c los estudiantes deben programar la suma entre distintos números, m y n. Es importante destacar que el desafío es mayor ya que en este punto se manejan más variables. El desafío es entender cómo usar la información y cómo calcular la suma de esos términos a partir de la suma de los n términos, restando los m términos anteriores. En concreto el programa que se espera es el siguiente:

  • sum2:: N X Nno0 X Nno0 X Nno0 -> R
  • sum2 (a, d, n, m) =  sum (a, d, m) -sum (a, d, n)

Para la última parte de la evaluación, tenemos que tener presente que exige un trabajo matemático mayor. Los estudiantes tienen que deducir  que d=(anam)(nm)d = \frac {(a_{n} – a_{m})} {(n – m)} y que a1=an(n1)da_{1} = a_{n} – (n -1) d. Esto no necesariamente resulta sencillo, pero sí exige realizar ese trabajo previo a empezar a programar. Es claro que la deducción no debe hacerse con un caso concreto, si no que debe realizarse de manera abstracta con los datos generales. Es decir, requiere un manejo algebraico que no todos los estudiantes manejan en este momento.

En definitiva, el programa que esperamos que los estudiantes construyan es el siguiente:

  • datos:: R X Nno0 X R X Nno0 -> R X R
  • datos(a, m, b, n) = (a -(m-1)*(a – b)/(m-n) , (a-b)/(m-n))

La implementación

Primero que nada, quiero mencionar la motivación. Es verdad que hay estudiantes que se motivaron mucho. Incluso algunos estudiantes que presentan bajo rendimiento en clase se destacaron trabajando con MateFun. Esto llevó a que la gran mayoría de los equipos que se formaran en clase subieran sus programas a CREA. Este interés generado por la programación hizo que incluso, una vez pasado el tiempo, los estudiantes siguieran pidiendo trabajar con las computadoras.

Así como destaco que los estudiantes se mostraban motivados, también existía un rechazo a trabajar con una dinámica que no era la que estaban acostumbrados. Por ejemplo, existió una dificultad a la hora de trabajar con factorización, se noto de menor forma cuando le pedíamos que trabajen con al diagonal de un rectángulo ya que era, en principio, no muy familiar en comparación con lo que los estudiantes estaban acostumbrados a trabajar. Este rechazo se vió resaltado ya que los estudiantes tenían que buscar una definición en internet e interpretarla para poder después realizar la programación correspondiente. Esto llevó a que preguntemos casos concretos como 5! o 10!, buscando que los estudiantes se familiaricen con el concepto y luego trabajamos con la computadora.

El segundo punto importante a tener en cuenta es si aprendieron matemática. Lo que estoy convencido es de que resignificaron muchos conceptos matemáticos debido a la extensa y necesaria introducción a MateFun. Esto llevó a que los estudiantes repasaran distintos conceptos, divisibilidad, geometría, potencia, factorial, entre otras, y en concreto las que queríamos trabajar como temas “nuevos” para los estudiantes vinculados a sucesiones.

En la lista anterior, hay que dedicarle un momento especial al concepto de función. Gracias a que el lenguaje de MateFun es un lenguaje funcional, obligaba a los estudiantes a tener sumamente presente el dominio y el codominio de la función. Esto es importante debido a que, más allá de que se trabajan funciones con distinto dominio en la currícula, no se le da la importancia que tiene a la hora de trabajar con este lenguaje que exige un nivel de rigurosidad a la hora de definir las funciones a las que los estudiantes no estaban acostumbrados.

Si bien estamos de acuerdo con Charlote (1986) cuando afirma que “el rigor del pensamiento y del lenguaje sigue siendo uno de los objetivos esenciales del aprendizaje de las matemáticas. Pero precisamente, se trata de un objetivo y no de la base o el punto de partida de la pedagogía de las matemáticas. El alumno debe aprender a ser riguroso, pero él solo puede llegar a serlo, si su actividad le muestra la necesidad” (p. 4). En quinto año de liceo, en la matemática específica de la orientación Ciencia y Tecnología, es un momento ideal para empezar a desarrollar el rigor matemático y la escritura para trabajar matemática desde un punto de vista más formal, y MateFun da un marco ideal en dicho sentido.

En cuanto a las dificultades, tengo que destacar que no fue una buena decisión el trabajar con sesiones de una vez por semana con los dos profesores del curso. Entiendo que la asiduidad debió haber sido aún mayor para evitar ciertos inconvenientes. De todas maneras, se perdieron clases por múltiples motivos que hacen a la vida institucional como ATD, reuniones docentes, alertas meteorológicas, entre otras. Esta fue una de las dificultades más notorias ya que algunos estudiantes no podían seguir el hilo de lo que venían trabajando, y nosotros perdíamos instancias para orientarlos.

Por último, algunos estudiantes pudieron mejorar su comprensión de las sucesiones en general, y de la particularidad que tiene la sucesión algebraica. Esto es especialmente importante, ya que en clase de matemática lo central debe ser el conocimiento matemático y la construcción de distintos conceptos matemáticos por parte de los estudiantes. MateFun no deja de ser una herramienta que nos permite trabajar conceptos matemáticos y resignificarlos por parte de los estudiantes.