Buscar

01-Origem e história do algoritmo

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 15 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 15 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 15 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

O
rigem e história do algoritmo
 
Se você, estudante, considerar que os computadores eram em
seu nascimento, nada mais do que sofisticadas máquinas de calcular,
perceberá o quanto da sua estruturação se originou da matemática. A
matemática e a computação sempre andaram juntas na ciência, e não
simplesmente onde podemos ver: no caso dos computadores utilizados
em extensos cálculos de fórmulas matemáticas diversas, mas também
em sua construção lógica. 
 A computação digital nasceu de uma sequência de eventos históricos de
evolução da matemática, mais especificamente dos algoritmos, sendo que
hoje, estes algoritmos são considerados muito mais do que sua origem,
mas sua base de estruturação lógica. 
Não se tem uma data de origem específica para os algoritmos, mas
existem muitas linhas de pesquisa e historiadores que a colocam no
período de 830 d.C. com a publicação do livro de álgebra, de autoria do
matemático e astrônomo muçulmano Abu Abdullah Muhammad Ibn Musa
al-Khwarizmi (780 d.C a 850 d.C.) Cujo nome curto seria al-Khwarizmi. De
acordo com Wazlawick (2016, p. 13) 
Esta obra foi responsável pela popularização dos algarismos indianos
(hoje conhecidos como arábicos ou indo-arábicos) na Europa e Oriente
Médio, os quais eram bem mais fáceis de operar do que os números
romanos, até então usados. O título do livro foi traduzido para o latim
como “Algoritmi de numero Indorum” e assim a tradução para o latim do
nome deste matemático passou a significar genericamente qualquer
procedimento mecânico para realização de cálculos. 
 
Como podemos observar na imagem do livro (figura 1), a primeira página
da tradução para o Latim do livro temos “Dixit algorizmi...”. 
 
Figura 01: Início do livro de al-Khwarizmi
De certa forma podemos compreender que a computação mecânica de
cálculos não foi completamente transformada nos computadores digitais,
apenas miniaturizada e aplicada com a ajuda da eletricidade. A base de
funcionamento dos computadores modernos ainda respeita as leis
matemáticas tais como desenvolvidas por al-Khwarizmi em suas técnicas,
como as de adição e divisão em números longos (ensinado nas escolas
atualmente). 
Entre outras contribuições, al-Khwarizmi mostrou como realizar adições e
divisões com números longos, um procedimento (ou algoritmo) até hoje
ensinado nas escolas, e que foi a base para a construção das primeiras
calculadoras mecânicas. (WAZLAWICK 2016, p. 13) 
Esta postulação de al-Khwarizmi permitiu a estruturação da aplicação
mecânica do processo de calcular, ou seja, deu subsídio a criação das
primeiras calculadoras mecânicas, pois apresentou com seus números
indo-arábicos uma forma muito mais elegante. 
As vantagens podem ser observadas no processo de soma de velocidade
maior quando comparada ao processo quando feito usando algarismos
romanos, por exemplo com a somatória de XIX + XXI = XL. As regras de
soma para a notação romana são complexas: 
• Primeiramente os números devem ser descompactados, trocando-se IV
por IIII, IX por VIIII etc.: XVIIII+XXI. 
• Depois eles são concatenados, ou seja, juntados: XVIIIIXXI. 
• Depois deve-se ordenar as letras da mais significativa para a menos
significativa: XXXVIIIII. 
• Finalmente o número resultante é recomposto: XXXVIIIII = XXXVV =
XXXX = XL. 
• Bem, a soma até que não era tão difícil, mas a divisão. (WAZLAWICK
2016, p. 13) 
 
Estamos falando de uma era da humanidade onde até mesmo a
matemática estava passando por evolução, e com a notação indo-arábica,
que era baseada em posições decimais, o avanço foi permitir somas feitas
de forma automática, e assim como fazemos atualmente e ensinamos nas
escolas, ou seja, da direita para a esquerda.
Devemos os avanços na computação a grandes estudiosos como al-
Khwarizmi, mas que com o passar dos anos passou a ser referenciado de
formas diferentes, portanto seu nome passou a ser transcrito e sua
pronúncia suavizada, como Al-Karismi, Algarismi, até que chegou a
algarismo, ficando conhecido como a nomenclatura que referenciava o
sistema numérico que utilizamos até hoje.
O termo algoritmo está ligado a computação e também apresenta
diversas publicações que o referenciam e o conectam a temas
computacionais, embora apresente diversas descrições: de um conjunto
de regras formais ou a solução de problemas, com fórmulas e expressões
aritméticas.
 
Algoritmos computacionais
 
Do ponto de vista estrutural, algoritmos podem ser vistos como uma
estrutura ideológica da mesma forma que são construídas as linguagens
de programação dos computadores: desenham o caminho matemático
para a solução de determinado problema. Portanto, podemos determinar
que se trata de um conjunto de passos, que podem ser repetidos,
encarregados de resolver um problema.
Mas de acordo com Manzano (2016) o termo algoritmo causa certa
estranheza em alguns momentos, pois os que estranham costumam
questionar se a grafia da palavra está correta. Mas os que estranham sua
grafia, ignoram sua origem, no latim, e derivam do termo alegorismo,
associado a ideia dos algarismos que por sua vez recebe influência do
grego aritmós, que representa números.
De acordo com o dicionário Aurélio, conforme Manzano (2016, p. 25), o
termo algoritmo é aplicado a computação e sua esfera matemática se
associa a um processo de cálculo e de resolução de problemas diversos
semelhantes e sem restrições. Já na ciência da computação, o termo
representa um conjunto de regras e operações definidos e ordenados,
que são destinados à solução de um problema, com um número de
passos pré-determinado e finito.
Para Forbellone e Ebersoacher (2005 apud Morais et al. 2018, p. 10), “[...]
algoritmo é um conjunto finito de regras, bem definidas, que nos levam à
solução de um problema em um tempo finito.” Portanto, o algoritmo
contém a descrição de um conjunto de ações, um grupo finito de passos,
para que certo objetivo seja atingido. Para que se tenha um algoritmo, é
preciso:
a) que se tenha um número finito de passos;
b) que cada passo esteja precisamente definido, sem possíveis
ambiguidades;
c) que existam zero ou mais entradas;
d) que existam uma ou mais saídas;
e) que exista uma condição de fim, sempre atingida em tempo finito, para
quaisquer entradas.
 
Com esta completa descrição, podemos compreender que, para a
computação, os algoritmos representam a base da lógica de
programação, que por sua vez representa tanto a coerência e
racionalidade, pois a lógica de programação é fundamentalmente um
processo explicitamente racional que conduz a construção de um
software, que assim como o algoritmo, é capaz de construir sistemas que
possam atingir seus objetivos.
Os algoritmos são criados e reconhecidos por sua lógica de programação.
Segundo Forbellone e Eberspacher (2005 Morais et al. 2018, p. 10), a
lógica está relacionada à coerência e à racionalidade; lógica de
programação é a racionalização dos processos formais da programação
de computadores e algoritmo é a sequência de passos que visam atingir
um objetivo bem definido.
Em sua descrição os algoritmos podem ser descritos graficamente com o
uso de diagramas de blocos, ou ainda em sua forma textual com as
linguagens formais de programação de computadores. Neste sentido,
temos a clara visão de que os algoritmos representam um processo de
sistematização da resolução de problemas de forma sequencial e
ordenada e para Berlinski (2002, p. 21 apud Manzano 2016, p. 25),
algoritmo é um método finito, escrito em um vocabulário simbólico fixo
regido por instruções precisas, que se movem em passos discretos (1, 2,
3...), cuja execução não requer insight, esperteza, intuição, inteligência ou
clareza e lucidez, e que mais cedo ou mais tarde chega a um fim. Um
algoritmo é qualquer procedimento computacional bem definido que toma
algum valor ou conjunto de valores como entradas e produz algum valor
ou conjunto de valores como saída.
Para o mundo da computação, um algoritmo vai representar um conjunto
formal de regras sequenciais e precisamente definidas, derivadas de uma
compreensão lógica de um problemaque precisa ser resolvido pelo
programador que está a construir determinado software.
Para quem cruza com as definições de algoritmo e de lógica de
programação pode ser um desafio compreender e dar sentido a tudo,
principalmente aos que não são do meio informático, mas vale ressaltar
que as vezes a dificuldade reside em um conceito muito mais simples e
facilmente incompreendido: o conceito de problema.
De forma puramente conceitual, um problema é uma proposta duvidosa,
algo que pode apresentar diversas soluções, questões sem resposta, gera
discussão, e que no universo computacional, representa a fuga a uma
determinada regra que impede o alcance do objetivo.
 
Programação estruturada
 
A muitos anos, softwares eram desenvolvidos apenas quando se tinha um
problema de grandes proporções a se resolver, com um volume de dados
considerável e que exigia grande número de operações. Claro que hoje
em dia existem softwares ou aplicativos (apps) que lidam com problemas
triviais, de baixa complexidade e volume de dados praticamente
negligente, mas que atendem a um número grande de usuários.
Mesmo com estas diferenças, os programas sempre sofreram com a
necessidade de ter relevância para que saíssem do projeto para as
“prateleiras” das lojas de informática. E temos que considerar outra
dinâmica dos programas: sua complexidade aumenta de acordo com a
complexidade do que pretende resolver, em outras palavras,
Seria ótimo poder apresentar pequenos programas e, ao final, dizer:
“agora expanda isso para programas maiores”. Infelizmente não é assim.
Um programa de mil linhas tem muito pouco a ver com um programa de
10 linhas. Programar não é uma atividade escalável, ou seja, estar
preparado para escrever um programa de 10 linhas não vai prepará-lo
para escrever um programa de 1000 linhas. (RIBEIRO 2018, p. 78)
Aplicar um programa de baixa complexidade a uma situação que exige
mais etapas para sua resolução, significa, em termos práticos, ter que
expandir seu código fonte, algo que é puramente textual. Este oneroso
processo costumava causar problemas quando os programadores
tentavam atalhos no processo de composição do código, de seu fluxo de
execução. Tal situação seria o mesmo que um escritor orientar, em seu
texto, que o leitor pulasse páginas,
Esse processo aconteceria por todo o livro, de acordo com outras
condições externas. Várias leituras seriam possíveis, mas o difícil seria
manter a coerência entre as várias possibilidades de leitura. Cada
percurso de leitura deveria contar uma história coerente. Isso não é
impossível de ser feito, mas envolveria um grande esforço mental do
escritor para domar toda a complexidade da tarefa. Três ou quatro linhas
de narrativa poderiam ser fáceis de organizar, mas, e se essas narrativas
chegassem à casa das dezenas ou centenas em um único livro?
Facilmente poderia haver alguma linha de narrativa sem sentido.
(RIBEIRO 2018, p. 78)
Dentro da lógica e dos processos não se deve criar atalhos dentro dos
programas de computador, pois com os diversos caminhos que o fluxo de
execução pode seguir, existe uma necessidade de amarração a uma
estrutura básica, de forma que permita manter a coerência do sistema
mesmo em casos de ampliação do seu código para agregar novas
funcionalidades.
Quando se adiciona códigos inadvertidamente, temos o chamado código
espaguete, um emaranhado de código praticamente ilegível e pouco
eficiente na resolução do problema que propõe. Para Ribeiro (2018, p.
78), é preciso pôr ordem nesse caos. (RIBEIRO 2018, p. 78)
Na programação estruturada, dividimos a solução do problema em blocos.
Cada bloco executa uma ação que pode consistir em um teste, na
repetição de comandos ou na obtenção de um resultado. Para manter a
complexidade em um nível compreensível, cada bloco possui apenas
uma entrada e uma saída para o fluxo da informação. Isso quer dizer que
um bloco recebe alguma informação, processa-a e devolve algum
resultado ao seu final. Note que falo em “blocos”. Cada bloco engloba
uma ou várias ações efetivas para a solução do problema. Isso impede o
surgimento do “código espaguete”. (RIBEIRO 2018, p. 78)
 
Quando se impõe uma estrutura, são estabelecidos blocos lógicos, cuja
estrutura estabelece entradas e saídas únicas e com isso a sistemática de
programação ganha melhor controle, mesmo em casos de programas
complexos, o que, inclusive, facilita a depuração dos eventuais erros,
como podemos observar na figura a seguir:
Figura 02: Bloco de processamento.
Existe grande praticidade na construção de sistemas pela lógica dos
blocos, que podem, inclusive, ser incorporados por blocos maiores, tal
como as Matrioskas, aquelas bonecas russas que se encaixam umas nas
outras. Mas o processo de incorporação de blocos mantém a dinâmica
das entradas e saídas únicas e temos que onde um bloco começa, outro
acaba de terminar seu processo.
Com a programação estruturada os blocos passam a apresentar regras
de escopo bem definidas, e desta forma outras partes de um programa
não podem inadvertidamente modificar variáveis ou redistribuir o fluxo de
execução padrão. Podemos dizer que um dos destaques da programação
estruturada é exatamente o de definir regras até mesmo para os desvios
que podem ser realizados.
De acordo com Ribeiro (2018, p. 79), “O escopo de uma variável define
em quais blocos a variável é visível, ou seja, o valor dessa variável só
pode ser lido e às vezes modificado dentro daquele bloco.” O mesmo
efeito ocorre com os desvios de execução, fazendo com que os desvios
de um bloco voltem ao mesmo bloco antes que as demais instruções
tenham início.
Dentro do contexto da programação estruturada podemos usar o termo
paradigma de forma extremamente positiva, pois aqui, paradigma é
programação estruturada, pois representa um modelo a ser seguido. Mas
na programação também apresenta outros modelos, como o paradigma,
a exemplo: a programação funcional, a programação orientada a eventos,
orientada a aspecto e a orientada a objetos.
Com isso podemos perceber que cada linguagem de programação nasce
para comportar melhor determinado paradigma, e de acordo com Aléssio
(2017, p. 08) “Essa técnica permite uma posterior codificação em qualquer
linguagem de programação de computadores, pois não se atinge um
detalhamento de instruções ou comandos específicos, os quais
caracterizam uma linguagem.” De acordo com esta linha de pensamento
podemos conceituar como sendo o objetivo deste tipo de metodologia de
projeto:
•
Agilizar a codificação da escrita de programas.
•
Facilitar a depuração da sua leitura.
•
Permitir a verificação de possíveis falhas apresentadas pelos
programas.
 
O destaque, neste processo, é a facilidade de se conduzir as alterações e
atualizações dos programas, mantendo seus objetivos e qualidade.
 
Cozinha x Computador
 
Longe da computação existe um processo vital ao ser humano que requer
a mesma obrigatoriedade de sequência lógica que a criação de um
software demanda: a Culinária! Já observou nos sites do tema que as
receitas costumam ter instruções muito precisas, finitas, e em blocos? No
que isso se assemelha senão na programação estruturada?
Portanto algoritmos são as receitas não culinárias que o computador vai
seguir para produzir o prato das informações de saída que o usuário vai
saborear ne desta forma,
Toda receita culinária é dividida em dois blocos de ação, sendo o bloco
ingredientes, no qual se definem os dados a serem usados e as
quantidades que devem estar preparadas e separadas para a elaboração
da receita, e o bloco modo de preparo, em que estão descritos o
programa de ações e a sequência de atividades. (MANZANO 2016, p. 27)
 
Embora a execução de um prato ou receita possa variar ligeiramente,
tanto os blocos de ingredientes e de preparo trazem informações
explícitas, um roteiro de sua realização e podem ocorrer problemas com o
resultado final, e até mesmo inviabilizar a entrega do prato ou receita. De
qualquer forma, ignorar algumas das informações dos blocos de
ingredientes ou de procedimentosresulta em um produto final distinto ao
proposto, e para Manzano (2016, p. 27)
Qualquer pessoa de posse de uma receita consegue, se seguir os seus
passos, preparar a refeição indicada sem grandes dificuldades; essas
pessoas são os cozinheiros. No entanto, existem outras que criam e
inventam receitas, normalmente chamadas de mestres-cucas. Há ainda
uma terceira pessoa, que simplesmente vai provar a refeição; é o usuário
da receita preparada pela pessoa que cozinhou, que não é
necessariamente um mestre-cuca, mas alguém que, ao longo de um
determinado tempo, pode se tornar um.
Fica claro a grande semelhança que apresenta a produção de softwares
com os processos de cozinha. Neste sentido temos o programador de
computador no mesmo esquema que um chef, um “Mestre-cuca”, aquele
encarregado de preparar o prato/sistema para a degustação/utilização do
usuário. Assim como nos restaurantes, o usuário não apresenta grande
curiosidade em saber como o prato foi feito, na programação o degustador
não será ávido em conhecer o código fonte do seu sistema, desde que
entregue o proposto.
Continuando a comparação cozinha e programação, não temos apenas
os mestre-cucas, temos também os que montam com algoritmos pré-
construídos, “São, na verdade, simples "cozinheiros", o que não é
demérito nenhum, porém não têm experiência para resolver todos os
problemas que possam surgir.” (MANZANO 2016, p. 27).
Em termos de nível de experiência, temos o programador/Mestre-cuca
com grande bagagem em lógica de programação e muita experiência, de
nível sênior e com isso capaz de criar seus algoritmos. Já em um nível
imediatamente abaixo, temos o programador cozinheiro, com pouca
sensibilidade na lógica de programação, pouca experiência e com isso
denominado nível júnior.
Neste nível, o programador é capaz de desenvolver algoritmos simples,
mas carece de supervisão de um programador sênior, e de acordo com
Manzano (2016, p. 28):
O profissional pleno consegue desenvolver algoritmos de nível médio a
complexo e necessita de supervisão e auxílio esporádicos de um
programador sênior. Ao usar algoritmos prontos e escritos por outros
programadores, gradativamente o programador júnior é preparado até se
tornar pleno, e o programador pleno se prepara para chegar a um nível
sênior e tornar-se, de certa forma, um "mestre-cuca".(MANZANO 2016, p.
28)
No menor escalão da programação temos o ajudante de cozinheiro, o
programador ajudante que está em início de carreira, não assume criação
de códigos complexos fazendo a montagem de programas com base em
algoritmos prontos. Os algoritmos produzidos pelos ajudantes são
simplificados e determinam a necessidade de supervisão de um
programador sênior.
 
 
Atividade Extra
 
 
Que tal ligar o tema desta aula a algo que está no cotidiano de todo
cidadão conectado: o youtube e seu algoritmo. São centenas de milhares
de pessoas que tentam faturar com seus vídeos no youtube e existem os
mais entusiasmados que buscam formas de aprimorar seus ganhos, e
para tal partem para uma avaliação de como a plataforma monetiza seus
youtubers destrinchando o código de seu algoritmo.
 
Desta forma recomendo a leitura do artigo que aborda como a plataforma
de vídeos youtube calcula o valor para vídeos de música pelo link:
https://core.ac.uk/download/pdf/268325698.pdf
 
 
Referência Bibliográfica
 
 
 
ALÉSSIO, Simone Cristina. Lógica e Técnicas de Programação:
UNIASSELVI, 2017.
 
DAVY, Rodrigo. O que é a programação estruturada. 2019. Disponível
em: <https://platzi.com.br/blog/programacao-estruturada/> Acesso em:
13/05/2021.
 
https://core.ac.uk/download/pdf/268325698.pdf

Continue navegando