Brincando com Pensamento Computacional em Tempos de Coronavírus

Brincando com Pensamento Computacional em Tempos de Coronavírus

por Raimundo José de Araújo Macêdo
Laboratório de Sistemas Distribuídos (LaSID)
DCI/IC/UFBA

Motivações

Março de 2020 nunca será esquecido. A doença causada pelo coronavírus SARS-CoV-2, da qual tínhamos notícias apenas vindas da distante China, se instalou de vez entre as longitudes 73°59’32” e 34°47’30”, ao sul do equador, o nosso Brasil. A distância de Wuhan, na China, possibilitou a coleta de dados sobre a propagação e consequências da COVID-19. Sem vacinas ou remédios eficazes, as recomendações que minimizam o eventual colapso do sistema de saúde, como hábitos de higiene e distanciamento social, foram a nossa melhor forma de combate naquela altura.

Para ajudar a lidar com o tempo de confinamento, um amigo, vez por outra, enviava problemas-desafio, ou charadas, para as quais cuidadosamente monitorava o progresso dos desafiados. Um dos desafios, enviado no dia 4 de abril de 2020, que encarei nas horas vagas entre trabalho acadêmico e faxinas de casa, utilizava símbolos do baralho e consistia em achar os valores para um símbolo de Copas, um de Espadas e um de Ouros, conforme a figura abaixo.

Resolvendo Problemas com o Pensamento Computacional

Quando recebi a imagem acima, deixei os símbolos do baralho de lado e pensei em variáveis, como fazemos em matemática e computação. Em seguida, fiz um pequeno programa em Python, utilizando um raciocínio computacional muito comum: “escolher e testar”; nesse caso, escolhendo valores para teste a partir de uma busca sequencial exaustiva no intervalo [1,999]. O teste consiste em verificar se o número “xyz” multiplicado por três é igual ao número “zzz”. O único resultado produzido pelo programa foi 185. Enviei de volta a mensagem via WhatsApp para o amigo, que logo respondeu: “bingo!”. 

Após informar o resultado, voltei ao problema e percebi que poderia ter usado outra abordagem, construído uma solução mais eficiente, ao invés de tentar achá-la por busca exaustiva. Observando a fórmula, percebe-se que o único número menor que 10 (ou dígito, em bom computês), que pode assumir o valor de z é o 5 (zero é a solução óbvia e não existe no baralho). Temos, então, 5+5+5=15, e sobra 1 para adicionar na coluna de y. Repete-se o processo para y e verifica-se que 8×3+1=25. Emprestando 2 para a coluna de x, tem-se 1×3+2=5. Pronto, o programa havia perdido a graça 😐

Para não perder a “viagem”, nem o programa, resolvi generalizar o problema, fazendo a seguinte pergunta: quais são os números que multiplicados pelo seu tamanho (número de dígitos) produzem outro número de igual tamanho e formado pela repetição de seu último dígito? 

No exemplo anterior, “xyz” tem tamanho três e z é seu último dígito. Em particular, quantos números de determinado tamanho possuem tal propriedade? Pronto, agora o problema ficou mais interessante e pude aproveitar melhor o programa. 

Voltei ao programa de busca exaustiva e o fiz rodar para números de 2 a 9 dígitos. O programa então produziu os números “185” e “148148”. Enviei, então, uma mensagem via WhatsApp para Bob (apelido de meu amigo Antônio Carlos Dias Gonçalves), informando a novidade, com o desenho abaixo. 


Nascia outro desafio e, melhor ainda, o novo número poderia ser mapeado para os mesmos três símbolos do problema original: um símbolo de Copas (x), um de Espadas (y) e um de Ouros (z). Ou seja, quais valores de x, y e z, satisfazem a “xyzxyz” multiplicado por 6 = “zzzzzz”? Bob ficou contente e agradeceu: “agora vou colocar a turma para esquentar a cuca! 😁”. 

Apesar do resultado, que deixou meu amigo Bob intrigado, eu não estava completamente satisfeito. O programa não respondeu todas as questões formuladas, pois havia demorando demasiadamente, a partir do cálculo para 9 dígitos (figura acima), tendo eu desistido de sua execução após aguardar por 10 minutos, acionando o conhecido control_c 😉. A demora excessiva, para 900.000.000 iterações do laço for da linha 7, para n = 9, foi provavelmente devido à implementação do comando range no interpretador Python, pois esse número não é tão grande para cálculos computacionais. 

A grande demora serviu para ilustrar que buscas exaustivas podem ser muito ineficientes, ou mesmo inviáveis, para espaços de busca muito grandes. De outro lado, como essa busca percorreu todo o espaço de possíveis soluções até a “parada”, se pode tirar algumas conclusões: havia somente uma única solução com três dígitos e outra única com 6 dígitos, nenhuma solução existia com 2,4,5,7 ou 8 dígitos. 

E para 9 dígitos, existia solução? 

Observem que podemos concluir sobre a inexistência de solução com 10 ou mais dígitos, mesmo sem rodar programa algum, apenas porque o dígito mais significativo somado 10 vezes resultaria em um valor maior ou igual a 10, levando a um resultado de 11 dígitos – ultrapassando, portanto, o tamanho 10 prescrito para o problema. Por isso, o programa de busca exaustiva somente procura soluções no intervalo [102,109). 

A dificuldade de encontrar o resultado para 9 dígitos me fez elaborar outra solução mais eficiente, ou seja, que executasse em menor tempo. Voltei à abordagem visual, onde primeiro se procura o valor z (último dígito) na somatória correspondente à coluna das unidades, seguido da coluna das dezenas, depois centenas, e assim em diante! 

Ao buscar a solução computacional equivalente, observei haver um padrão que se repetia, com parâmetros distintos. Esses são ingredientes para se utilizar outro raciocínio computacional muito poderoso: a recursão. Se a somatória de dada coluna ultrapassa o valor 9, utiliza-se o resto da divisão inteira por 10 no teste de igualdade a z. O respectivo quociente é emprestado para a somatória da próxima coluna, correspondente ao dígito imediatamente mais significativo, e assim por diante. Todas as somatórias podem receber e passar valores positivos (maior que zero), exceto a primeira somatória do dígito menos significativo, que não recebe valor emprestado, e a última somatória do dígito mais significativo, que não empresta nenhum valor. No exemplo inicial, o valor 15 é solução para a primeira somatória (5+5+5), fixando o 5 e levando emprestado 1 para a próxima somatória (8+8+8+1=25). A última somatória recebe 2 (2+1+1+1=5). 

Seja n o número a ser verificado. No código abaixo, da função recursiva, z e d são, respectivamente, o dígito menos significativo e o número de dígitos de n. O parâmetro q representa o quociente que veio emprestado da somatória anterior e nd é número de dígitos do número reduzido, calculado a cada chamada recursiva  (d = nd na primeira execução da função recursiva, que ocorre na linha 19 do código abaixo).

Observe que o procedimento recursivo somente prossegue quando existe uma solução na somatória anterior, 15 no exemplo inicial do número 185. Dessa forma, o espaço de busca é reduzido para as soluções possíveis. Ademais, para cada dígito i de números de tamanho d, são executados no máximo 9 somatórias (com quantidade variável de elementos: i somado d vezes, ou i*d), resultando, no pior caso, em uma quantidade de passos proporcional ao número de dígitos multiplicado por 9. O pior caso somente ocorre em buscas que percorrem todas as opções para o dígito mais significativo (linha 6 do código acima). Na busca exaustiva, a quantidade de passos é proporcional ao valor máximo de um número com d dígitos. Grosso modo, no exemplo de três dígitos (d = 3), teríamos 999 passos para busca sequencial exaustiva, contra 27 (3×9) da solução recursiva.

O programa recursivo produziu o resultado em tempo quase imperceptível após um clique, mostrando, finalmente, não haver solução para 9 dígitos. 

Moral da história…

O pensamento ou raciocínio computacional e algum conhecimento de eficiência na execução de programas são meios poderosos para resolução de problemas, especialmente aqueles cujas soluções ainda são desconhecidas. Para além de sua utilização em desafios lúdicos, que aqui serviu para ilustrar os conceitos básicos de busca em espaço de possíveis soluções e eficiência na execução de programas, é uma ferramenta cada vez mais fundamental para qualquer profissional em qualquer área do conhecimento.

Mas, afinal, o que é Pensamento Computacional?

Pensamento computacional, tradução livre do termo inglês computational thinking, tem sido empregado para descrever habilidades envolvidas na descrição de processos e abstrações utilizadas em abordagens computacionais em diversas áreas do conhecimento. O termo raciocínio computacional é também utilizado por alguns autores para o mesmo conceito, porque, como argumentam os autores, pensamento pode ser consciente ou inconsciente, enquanto raciocínio refere-se a uma operação lógica mental (MACÊDO; CAVALLO; GORENDER; MARQUES, 2020). 

Apesar do maior interesse das últimas décadas, o cientista estadunidense Alan Jay Perlis, já em 1962, argumentava que programar computadores deveria fazer parte da formação de todas as pessoas, e descreveu computação como a exploração e automação de processos (PERLIS, 1962). Dessa forma, processos podem ser descritos, depurados e aperfeiçoados, permitindo a exploração de fenômenos e ideias abstratas, complexas e dinâmicas, difíceis de serem compreendidas fora do contexto computacional. 

A origem do pensamento computacional é antiga e precede os computadores digitais, a exemplo do algoritmo atribuído a Heron de Alexandria, no início da era cristã, para cálculo de raízes quadradas aproximadas. Uma descrição precisa relativa ao pensamento computacional deu-se com a publicação, em 1936, dos conceitos de máquina universal e computabilidade, por Alan Turing, cientista inglês, considerado o pai da Ciência da Computação (TURING, 1937). Com os primeiros computadores digitais no final da década de 1940 e início da década de 1950, o pensamento computacional passou a ser utilizado para solução de problemas científicos complexos de cunho matemático. A partir do estabelecimento da era digital na segunda metade do século XX, e do surgimento da Internet, em particular, a abordagem computacional expandiu-se como meio de solução de problemas em quase todas as áreas e aspectos da vida contemporânea. Dada sua onipresença como ferramenta para solução de problemas em múltiplas disciplinas, o pensamento ou raciocínio computacional se revela um meio particularmente poderoso para tratar problemas interdisciplinares (MACÊDO; CAVALLO; GORENDER; MARQUES, 2020).

O cientista estadunidense Seymour Papert, de origem sul-africana, foi pioneiro em tratar o pensamento computacional como objeto de educação (PAPERT, 1980) e um dos criadores da linguagem LOGO para o ensino de programação para crianças. Papert se destacou por propagar a utilização do computador como instrumento no processo de construção de conhecimentos, a partir dos princípios do construtivismo cognitivo de Jean Piaget, em estratégia educacional por ele denominada construcionismo (PAPERT, 1991). 

No entanto, o termo “pensamento computacional” é mais recente, popularizado pela cientista de computação estadunidense Jeannette Wing, em um artigo intitulado “computational thinking”, publicado na revista “Communications of the ACM” nos Estados Unidos em 2006 (WING, 2006). Em seu artigo, Jeannette argumenta que pensamento computacional deveria ser uma habilidade comum, utilizada por todas as pessoas, não somente por cientistas da computação. Mais ainda, argumenta que deveria ser introduzido para crianças, da mesma forma que escrita, leitura e aritmética. 

Jeannette definiu pensamento computacional como processos de pensamento ou raciocínio utilizados para formular problemas e expressar respectivas soluções que possam ser resolvidas de forma automática por um computador, ou mesmo por uma pessoa seguindo o processo definido em uma solução. 

De fato, tal definição engloba todos os mecanismos utilizados por cientistas da computação, tais como abstrações, modelos, decomposição no tratamento de problemas complexos, simulação, entre outras estratégias. Dessa forma, pensamento computacional não define um novo campo do saber, mas um conjunto de competências e habilidades resultantes do estudo e da prática dos mecanismos e conceitos fundamentais utilizados na Ciência da Computação.

Ao compreender o universo da Ciência da Computação, o indivíduo se habilita, portanto, a tratar problemas e formular soluções utilizando o pensamento computacional, de uma forma natural, como foi aqui ilustrado para a charada dos símbolos das cartas de baralho.

Notas
1. A versão anterior deste artigo foi publicada na rede social researchgate.net (MACÊDO, 2020), pouco depois do início da pandemia de COVID-19.
2. Meus sinceros agradecimentos ao professor Roberto Pereira, editor da SBC Horizontes, pela ajuda na diagramação deste artigo.

Referências 

PAPERT, Seymour. Mindstorms: Children, computers, and powerful ideas. Basic Books, Inc., 1980.

PAPERT, Seymour; HAREL, Idit. Situating constructionism. Constructionism, v. 36, n. 2, p. 1-11, 1991.

TURING, Alan M. On computable numbers, with an application to the Entscheidungsproblem. Proceedings of the London mathematical society, v. s2-42, n. 1, p. 230-265, 1937.

WING, Jeannette. Computational thinking. Communications of the ACM, v. 49, n. 3, p. 33-35, 2006.

MACÊDO, Raimundo José de Araújo; CAVALLO, David; GORENDER, Sérgio; ARAÚJO, Bilzã Marques. Raciocínio Computacional na Formação Geral Pavimentando o Caminho da Interdisciplinaridade. In: de Tughy, Rosângela Pereira; Gonçalves, Gustavo (Org.). Universidade popular e encontro de saberes. Salvador: EDUFBA, 2020, p. 411-424. Disponível em: https://repositorio.ufba.br/ri/handle/ri/32949. Acesso em 17 março 2020.

MACÊDO, Raimundo J. de A. Brincando com Raciocínio Computacional. Abril, 2020. Disponível em https://www.researchgate.net/publication/340582152_Brincando_com_Raciocinio_Computacional Acesso em 6 de novembro de 2022.

PERLIS, A. J. “The Computer in the University”. In Computers and the World of the Future (M. Greenberger, ed.). MIT Press, p. 180-219, 1962.

Autoria

Raimundo José de Araújo Macêdo é Professor Titular no DCI/IC da Universidade Federal da Bahia (UFBA) e Presidente da Sociedade Brasileira de Computação (SBC).


Como citar essa matéria
:
MACÊDO, Raimundo José de Araújo. Brincando com Pensamento Computacional em Tempos de Coronavírus. SBC Horizontes. ISSN 2175-9235. dezembro de 2022. Disponível em: http://horizontes.sbc.org.br/index.php/2022/12/brincando-com-pensamento-computacional-em-tempos-de-coronavirus/. Acesso em: dd mês aaaa.

Compartilhe: