Introducción a la Programación Sistemática – Semana 6
La semana 6 es definitivamente cuando empiezo a sentir el agotamiento de los MOOC.
Parece suceder en todas mis clases ahora: me he estado conectando obedientemente, pero sin la "presión" de los horarios de clase asignados, un profesor que revisa mi trabajo, compañeros de clase con los que converso, siempre parece que lucho alrededor de un mes y medio en mis cursos en línea. Sin embargo, no temas, pasé la semana 6 y te traigo, como siempre, un resumen completo. La semana 6 en Introducción al Diseño Sistemático de Programas aborda la idea de Referencia Mutua... ¡Aquí vamos!
Lección 1: Más Ayudantes y Ayudantes Mutuos
Al comienzo de esta lección, se nos recuerda que el propósito de la receta de HtDF es dividir sus problemas grandes y aparentemente insuperables en otros más pequeños y manejables. Este recordatorio tiene más sentido un momento después, porque esta semana explicará cómo no solo desglosar los problemas, sino también los tipos de datos y las funciones. El instructor del curso explica que, aunque anteriormente en el curso siempre hemos mantenido los tipos de datos y las funciones completos, en la semana 6 vamos a aprender a dividirlos, de forma similar a como hemos dividido todos nuestros problemas. También se nos informa de que aprenderemos un nuevo tipo de datos de tamaño arbitrario que se completa con sus propios ayudantes integrados.
Lección 2: Más ayudantes – Composición de funciones
Esta lección comienza con un gran problema de práctica que abarca varias lecciones, por esa razón, mis notas son un poco escasas aquí, porque detallar cada paso del problema de práctica parece un poco redundante y poco interesante. 😉

Con respecto al concepto de la Lección 1 sobre la división de una función en varias partes, este es un ejemplo perfecto. Cuando se considera un problema dividido en problemas internos más pequeños, esto es lo que se conoce en HtDF como un problema de composición de funciones (es decir, cuando hay dos operaciones distintas en los datos que se van a consumir). Aparentemente, esto es increíblemente fácil de lograr, porque, lo adivinaste, ¡hay una plantilla para eso! Racket tiene una plantilla de composición de funciones, cuya lección 2 luego nos guía a través del uso. He aquí un ejemplo rápido: (define (arrange-images loi) (layout-images (sort-images loi)))
Como puede ver en lo anterior, hay dos funciones integradas en una definición. Después de escribir la definición, como siempre, se nos indica que escribamos las entradas de nuestra lista de deseos para que no se olvide nada. J
Lección 3: Diseñar una lista de imágenes
Esta lección continúa el ejemplo de la lección anterior. Lo más importante que se revisa en esta lección es asegurarse de que las expectativas de comprobación de MATCHING se pasen después de escribir la función. Nota: Si se produce un error en las expectativas de comprobación de una función incompleta.
Lección 4: Más Ayudantes – Operando en una Lista
De nuevo, ¡un buen y breve dato de esta lección!
En el caso de codificar una función, cuando necesite operar en una lista, debe crear una nueva función auxiliar.
¡Sí, eso es todo para la lección 4!
Lección 5: Más Ayudantes – Cambio de Conocimiento de Dominio
Esta lección tiene un enfoque muy interesante: cambiar las áreas de conocimiento en medio de la programación en Racket requiere que crees funciones auxiliares. Lo sé, ¡¿qué?! Intentemos esto: "Al cambiar de ordenar imágenes a comparar el tamaño de una imagen, esto es un cambio de conocimiento de dominio". Entonces, en esencia, cuando estás haciendo algo DIFERENTE con los elementos de tu lista, creas una nueva función. Por supuesto, esta es una de las cosas que menos me gustan de este curso, porque siento que da como resultado montones y montones de código extra, que podrían ser más... ¿compacto?, entiendo que rompe la lógica de la programación y lo hace más fácil para los principiantes. (¿Acabo de decir eso? ¿Eso significa que ya no soy un principiante? ¡Dios mío, espero que no! Jaja.)
Notas adicionales:
Si usas un artículo repetidamente para probar, ¡conviértelo en una constante! Es más fácil y ayuda a evitar errores.
Lección 6: Más Ayudantes – Conclusión
En teoría, aquí es donde ocurre la magia de los ayudantes. Una vez que escribas tu última función auxiliar y ejecutes tu código, todas tus pruebas deberían pasar mágicamente, ¡porque tu función original estaba esperando a que se escribieran las ayudantes!
No?
Bueno, entonces primero debes revisar tus pruebas en busca de errores, porque es posible que simplemente tengas un error tipográfico. Si ese no es el problema, entonces, tienes que depurar tus funciones.
¡Además! Dado que este es el final de la "primera mitad" de la Semana 6, hubo algunas pequeñas notas de recapitulación:
- ¡Recuerda todas estas nuevas reglas de ayuda que aprendimos esta semana! Los necesitaremos para más adelante.
- No tenga miedo de utilizar Macro Notion: divida el trabajo de las funciones principales utilizando reglas de ayuda y haga su vida más fácil.
Lesson 7: List Abbreviations
I. Amado. Éste. Lección.
En serio, ¡escribir listas en Racket hasta ahora ha sido una abominación! En esta lección, se nos indica que movamos nuestra definición de idioma en Dr. Racket de "Idioma básico del estudiante" a "Idioma básico del estudiante con abreviaturas de lista". Agradecer. Bondad.
Lo que esto significa en cuanto a programación es que cuando escribes una lista, ¡ya no necesitas contras! Las listas ahora tendrán sentido!! Al escribir una lista, ahora se puede componer así: (lista "a" "b" "c"). ¡PUNTUACIÓN!
Sin embargo, es importante tener en cuenta que todavía *puedes* usar contras y, en algunos casos, tendrá más sentido. Si está agregando a una lista, por ejemplo, aún querrá decir:
(define L1 (list “b” “c”))
(cons “a” L1)
Para producir: (lista "a" "b" "c").
La razón de esto es que si intenta usar append, debe ingresar dos LISTS, que luego producirán una lista con los elementos de ambos.
Lesson 8: Mutually Recursive Data
Los datos mutuamente recursivos se definen en Racket como datos con dos ciclos en el tipo comentario. Este tipo se conoce como árbol de aridad arbitraria, ya que todos los elementos pueden contener también subelementos. Esta cualidad arbitraria significa que los elementos pueden ser ambos arbitrarios en ambos elementos, extendiéndose a lo ancho y a lo alto. Aquí hay un ejemplo de lo que estoy hablando:

En Racket, al construir un árbol de aridad arbitrario, usas.... ¡Listas! (Impactante, ¿verdad?)
Por ejemplo, pasar de la descripción del elemento a ListOfElement (ciclo) es una referencia mutua, que puede entenderse como un ciclo "arbitrario". Por lo tanto, cuando se pasa por un ciclo de referencia, y las flechas regresan al lugar donde comenzó el ciclo de referencia, esto se conoce como una "referencia mutua", ¡porque se apuntan entre sí!
Lesson 9: Templating Mutual Recursion
¡Un consejo importante aquí y eso es todo!
Escriba las plantillas para tipos de datos mutuamente recursivos al escribir el programa. ¿Por qué? ¡Es más fácil! Simple y llanamente. J
Lección 10: Funciones en Datos Mutuamente Recursivos – Parte 1
Cuando hay 2+ funciones que operan en datos que se recusirven mutuamente, no solo debe escribirlas juntas, sino escribirlas todas de inmediato, con los mismos ejemplos, firma y propósito.
He aquí un ejemplo:
(define (sum-data—element e) 0)
(define (sum-data—loe loe) 0)
Cuando estás haciendo esto... No olvide sus ejemplos de casos base y también recuerde cambiar el nombre de todas sus llamadas mutuamente recursivas y autorreferenciales de inmediato. Ambos elementos le ahorrarán una *tonelada* de dolor de cabeza y angustia más adelante. Prometer.
Otra vez... como de costumbre... RECUERDE CONFIAR EN LA RECURSIVIDAD NATURAL.
Lección 11: Funciones en Datos Mutuamente Recursivos – Parte 2
Two big takeaways here:
- El caso base es donde se detienen los ciclos de referencia. (Pensé que esto era muy conmovedor, nunca antes lo había pensado de esta manera, ¡pero es tan cierto!)
- Tenga cuidado con las convenciones de nomenclatura con dos funciones. Sé claro y MANTENTE ORGANIZADO.
Lección 12: Búsqueda de retroceso
Aquí hay una última función para la semana usando árboles de aridad arbitrarios.... ¡Búsqueda de retroceso!
¿Qué es eso? Es cuando buscas en un árbol un elemento con un valor/nombre determinado. Es importante recordar aquí que las hojas del árbol se buscan DESPUÉS de las de arriba, por lo que se encuentran "en" sus padres. La búsqueda de retroceso entra en juego aquí porque si llegas al final de una rama de tu árbol y no encuentras el elemento que estás buscando (conocido como "hoja fallida"), tienes que atravesar BACK UP en el árbol para bajar por una rama diferente, no puedes simplemente saltar. Esto se repite a través de la navegación de todo el árbol, ¡hasta que te quedas sin ramas y hojas!
Week 6 Summary
Esta semana estuvo POR TODOS lados, y como mencioné, fue difícil para mí simplemente superarla. Sin embargo, creo que, en general, los conceptos son definitivamente manejables, y espero con ansias las últimas dos semanas de clase. ¡¡Deséame suerte!!
¿Preguntas/Comentarios?
Siéntete libre de comentar aquí en mi blog, o encuéntrame en Twitter @DokiDara.