Introdução à Programação Sistemática – Semana 6
A semana 6 é definitivamente quando estou começando a sentir o esgotamento do MOOC.
Parece acontecer em todas as minhas aulas agora - eu tenho me conectado obedientemente, mas sem a "pressão" dos horários de aula atribuídos, um professor verificando meu trabalho, colegas com quem converso, sempre pareço lutar cerca de um mês e meio em meus cursos online. Não tenha medo, porém, eu cheguei à semana 6 e estou trazendo para vocês, como sempre, um resumo completo! A semana 6 em Introdução ao Design Sistemático de Programas aborda a ideia de Referência Mútua ... Aqui vamos nós!
Lição 1: Mais Ajudantes e Ajudantes Mútuos
No início desta lição, somos lembrados de que o objetivo da receita do HtDF é dividir seus problemas grandes e aparentemente intransponíveis em problemas menores e mais gerenciáveis. Este lembrete faz mais sentido um momento depois, porque esta semana explicará como não apenas detalhar os problemas, mas também os tipos de dados e as funções! O instrutor do curso explica que, embora anteriormente no curso sempre tenhamos mantido os tipos de dados e as funções inteiros, na semana 6 aprenderemos como dividi-los, da mesma forma que dividimos todos os nossos problemas. Também somos informados de que aprenderemos um novo tipo de dados de tamanho arbitrário que é completo com seus próprios auxiliares integrados.
Lição 2: Mais Ajudantes – Composição da Função
Esta lição começa um grande problema prático que abrange várias lições - por esse motivo, minhas anotações são um pouco esparsas aqui, porque detalhar cada etapa do problema prático parece um pouco redundante e desinteressante. 😉

Em relação ao conceito da Lição 1 sobre a divisão de uma função em várias partes, este é um exemplo perfeito. Quando você considera um problema dividido em problemas internos menores, isso é conhecido no HtDF como um Problema de Composição de Função (também conhecido como quando há duas operações distintas nos dados que devem ser consumidos). Aparentemente, isso é incrivelmente fácil de conseguir, porque, você adivinhou, existe um modelo para isso! Racket tem um Modelo de Composição de Função, que a lição 2 nos orienta no uso. Aqui está um exemplo rápido: (define (arrange-images loi) (layout-images (sort-images loi)))
Como você pode ver acima, existem duas funções embutidas em uma definição. Depois de escrever a definição, como sempre, somos instruídos a escrever nossas entradas na lista de desejos para que nada seja esquecido. J
Lição 3: Criando uma lista de imagens
Esta lição continua o exemplo da lição anterior. A coisa mais importante que é revisada nesta lição é garantir que suas expectativas de verificação MATCHING sejam aprovadas depois que você escrever sua função. Nota: Se a verificação esperada de uma função incompleta falhar.
Lição 4: Mais ajudantes – Operando em uma lista
Mais uma vez, um petisco agradável e curto desta lição!
No caso de codificar uma função, quando você precisa operar em uma lista, você precisa criar uma nova função auxiliar.
Sim, é isso para a lição 4!
Lição 5: Mais Ajudantes – Mudança de Conhecimento de Domínio
Esta lição tem um foco muito interessante – mudar as áreas de conhecimento no meio da programação no Racket requer que você crie funções auxiliares. Eu sei, o quê?! Vamos tentar o seguinte: "Ao mudar da classificação de imagens para a comparação do tamanho de uma imagem, essa é uma mudança de conhecimento de domínio." Então, em essência, quando você está fazendo algo DIFERENTE com os itens da sua lista, você cria uma nova função. Concedido, esta é uma das minhas coisas menos favoritas sobre este curso, porque eu sinto que resulta em muitos e muitos códigos extras, que poderiam ser mais... compacto?, Eu entendo que ele quebra a lógica da programação e torna mais fácil para iniciantes. (Eu acabei de dizer isso? Isso significa que não sou mais um iniciante? Puxa, espero que não! Haha.)
Notas adicionais:
Se você usar um item repetidamente para teste, apenas torne-o uma constante! É mais fácil e ajuda a evitar erros.
Lição 6: Mais Ajudantes – Embrulhar
Em teoria, é aqui que a mágica dos ajudantes acontece. Depois de escrever sua última função auxiliar e executar seu código, todos os seus testes devem passar magicamente, porque sua função original estava apenas esperando que os auxiliares fossem escritos!
No?
Bem, então você deve verificar se há erros em seus testes primeiro, porque você pode simplesmente ter um erro de digitação. Se esse não for o problema, bem, então, você precisa depurar suas funções.
Também! Como este é o final da "primeira metade" da Semana 6, houve algumas pequenas notas de encerramento:
- Lembre-se de todas essas novas regras de ajudante que aprendemos esta semana! Precisaremos deles para mais tarde.
- Não tenha medo de utilizar o Macro Notion – Separe o trabalho das funções principais usando regras auxiliares e facilite sua vida!!
Lesson 7: List Abbreviations
I. Amei. Este. Lição.
Sério, escrever listas em Racket até agora tem sido uma abominação! Nesta lição, somos instruídos a mover nossa definição de idioma no Dr. Racket de "Linguagem Básica do Aluno" para "Linguagem Básica do Aluno com Abreviações de Lista". Agradecer;. Bondade.
O que isso significa no que diz respeito à programação é que, quando você escreve uma lista, não precisa mais de contras!! As listas agora farão sentido!! Ao escrever uma lista, ela agora pode ser composta assim: (lista "a" "b" "c"). PONTUAÇÃO!
No entanto, é importante observar que você ainda *pode* usar contras e, em alguns casos, fará mais sentido. Se você estiver adicionando a uma lista, por exemplo, ainda gostaria de dizer:
(define L1 (list “b” “c”))
(cons “a” L1)
Para produzir: (lista "a" "b" "c").
A razão para isso é que, se você tentar usar append, precisará inserir duas LISTS, que produzirão uma lista com os elementos de ambas.
Lesson 8: Mutually Recursive Data
Os dados mutuamente recursivos são definidos no Racket como dados com dois ciclos no comentário de tipo. Esse tipo é conhecido como uma árvore de aridade arbitrária, pois todos os elementos também podem conter subelementos. Essa qualidade arbitrária significa que os elementos podem ser arbitrários em ambos os elementos que se estendem pela largura e altura. Aqui está um exemplo do que estou falando:

No Racket, ao construir uma árvore de aridade arbitrária, você usa.... Listas! (Chocante, certo?)
Por exemplo, ir da descrição do elemento para ListOfElement (ciclo) é uma referência mútua, que pode ser entendida como um ciclo "arbitrário". Então, quando você passa por um ciclo de referência e as setas retornam ao local onde o ciclo de referência começou, isso é conhecido como "referência mútua", porque elas apontam uma para a outra!
Lesson 9: Templating Mutual Recursion
Uma dica importante aqui e pronto!
Escreva seus modelos para tipos de dados mutuamente recursivos juntos ao escrever seu programa. Por que? É mais fácil! Puro e simples. J
Lição 10: Funções em dados mutuamente recursivos – Parte 1
Quando há 2+ funções que operam em dados mutuamente recorrentes, você não deve apenas escrevê-las juntas, mas escrevê-las todas imediatamente, com os mesmos exemplos, assinatura e propósito!
Aqui está um exemplo:
(define (sum-data—element e) 0)
(define (sum-data—loe loe) 0)
Quando você está fazendo isso... Não se esqueça de seus exemplos de caso base e lembre-se também de renomear todas as suas chamadas mutuamente recursivas e auto-referenciadas imediatamente. Ambos os itens vão poupar uma * tonelada * de dor de cabeça e dor de cabeça mais tarde. Prometer.
Outra vez... como sempre... LEMBRE-SE DE CONFIAR NA RECURSÃO NATURAL.
Lição 11: Funções em dados mutuamente recursivos – Parte 2
Two big takeaways here:
- Seu caso base é onde seus ciclos de referência param. (Achei isso muito comovente, nunca pensei nisso dessa maneira antes, mas é tão verdade!)
- Cuidado com as convenções de nomenclatura com duas funções. Seja claro e MANTENHA-SE ORGANIZADO.
Lição 12: Retroceder a pesquisa
Aqui está uma última função para a semana usando árvores de aridade arbitrárias.... Retrocedendo a pesquisa!
O que é aquilo? É quando você pesquisa uma árvore por um elemento com um determinado valor/nome. É importante lembrar aqui que as folhas da árvore são pesquisadas APÓS as acima, então elas são encontradas "em" seus pais. A pesquisa de retrocesso entra em jogo aqui porque se você chegar ao final de um galho em sua árvore e não encontrar o elemento que está procurando (conhecido como "folha com falha"), você tem que atravessar BACK UP na árvore para descer um galho diferente, você não pode simplesmente pular. Isso se repete através da navegação de toda a árvore, até que você fique sem galhos e folhas!
Week 6 Summary
Esta semana estava em todo lugar e, como mencionei, foi difícil para mim simplesmente passar. No entanto, acho que, no geral, os conceitos são definitivamente administráveis e estou ansioso pelas duas últimas semanas de aula. Desejem-me sorte!!
Perguntas/Comentários?
Sinta-se à vontade para comentar aqui no meu blog ou me encontrar no Twitter @DokiDara.