- Vanessa Moura
O QUE SÃO ALGORITMOS? PARTE 1.

O nome algoritmo vem do nome Al-Khwarizmi que foi um matemático, astrônomo, geógrafo e autor persa. Conhecem-se poucos detalhes de sua vida, basicamente de que ele era um erudito na Casa da Sabedoria de Bagdade.

Ele apresentou a primeira solução sistemática das equações lineares e quadráticas. É considerado o fundador da Álgebra, um crédito que compartilha com Diofante. No século XII, traduções para o latim de sua obra sobre numerais indianos apresentou a notação posicional decimal para o Mundo Ocidental. Revisou a geografia de Ptolomeu e escreveu sobre astronomia e astrologia.
Suas contribuições tiveram um grande impacto sobre a linguagem. "Álgebra" é derivado de al-jabr, uma das duas operações que ele usou para resolver equações quadráticas. O radical de algarismo e algoritmo vem de algoritmi, a forma latina de seu nome. Além do português algarismo, seu nome também deu origem ao espanhol guarismo.
E é dai que tiramos o nome Algoritmo, até soa parecido né? Agora tente falar o nome dele três vezes sem parar.
Al-Khwarizmi, Al-Khwarizmi, Al-Khwarizmi...

Talvez ele apareça do nada com o seu mapa astral pronto.
Um dos primeiros algoritmos criados foi o algoritmo de Euclides é um método simples e eficiente de encontrar o MDC, para quem lembra ou prestou atenção nas aulas de matemática vai lembrar disso. MDC significa máximo divisor comum entre dois números inteiros diferentes de zero. É um dos algoritmos mais antigos, conhecido desde por volta de 300 antes de cristo. Neste algoritmo não exige qualquer fatoração.

O MDC de dois números inteiros é o maior número inteiro que divide ambos sem deixar resto. O algoritmo de Euclides é baseado no princípio de que o MDC não muda se o menor número for subtraído ao maior.
Por exemplo, 21 é o MDC de 252 e 105 (252 = 21 × 12; 105 = 21 × 5); já que 252 − 105 = 147, o MDC de 147 e 105 é também 21. Como o maior dos dois números é reduzido, a repetição deste processo irá gerar sucessivamente números menores, até convergir em zero.
<- Aqui do lado temos um gif que simula o algoritmo de Euclides para os números inteiros 252 e 105. As barras representam múltiplos de 21, o máximo divisor comum (MDC). Em cada passo, o número menor é subtraído ao maior, até um número ser reduzido a zero. O número restante é o MDC.
Mas o que é um algoritmo? É só matemática isso? Mas Vanny, você disse que não precisa de matemática para se trabalhar com Tecnologia da Informação!
Okaaaay! Vamos com calma!
A definição de um algoritmo é: Sequência de instruções ordenada com o objetivo de resolver um problema.

Pense nisso como um manual de instruções para montar um móvel. Você tem todos os passos e até mesmo o requerimento de quais ferramentas usar para chegar na solução do seu “problema”, que é a montagem final do seu móvel.
Você precisará ordenar e encaixar as peças e utilizar ferramentas que vão te ajudar a colocar as coisas nos lugares certos e as vezes você precisa seguir uma ordem, se não tudo dará errado.
Ou não... Talvez dê certo. E vou explicar o porque com a analogia abaixo.
Até mesmo podemos comparar um algoritmo com uma receita de bolo, onde se é passada as informações e você tem que seguir as instruções, por exemplo, um bolo não é bolo se você esquecer de colocar fermento. É um dos principais ingredientes. Os demais, podem até ser substituidos, como por exemplo o ovo, o leite e qualquer outro ingrediente, mas se caso você esquecer o fermento, isso não será um bolo, talvez um brownie.

O mesmo acontece quando se tem dois desenvolvedores diferentes e um problema em comum, se colocarmos o mesmo problema para que ambos o resolvam, nenhum deles vai fazer um código exatamente do mesmo jeito que o outro. Cada um tem um jeito diferente de se resolver um problema, de se raciocinar e isso não quer dizer que ambos estejam errados, apenas soluções diferentes para um problema comum.
Se substituir algo aqui, colocar algo desnecessário ali, faz parte. No fim das contas, o bolo sai. Talvez não com o mesmo sabor, textura ou aparência esperado. O mesmo se aplica a um código, talvez um seja mais rápido e efeciente que o outro.

ALGORITMO x PROGRAMA
Muitas pessoas confundem algoritmo com programa de computador, o que não tem nada a ver uma coisa com a outra. Nós usamos o computador para poder executar o algoritmo. E isso é devido ao fato do computador ser mais rápido e preciso na hora de processar isso do que um ser humano.
Mas antes de passar para um programa que vá compilar, primeiramente, o algoritmo deve ser transcrito para uma linguagem de programação qualquer antes do computador executar. Ou seja, a linguagem de programação não é o algoritmo em si, você traduz seu algoritmo para os comandos da determinada linguagem. O algoritmo é a lógica por trás do seu código e o programa de computador ou computador executa esses “comandos”. Já que recebeu instruções em uma linguagem em que o computador entenda.
Tenho uma outra analogia:

O português, o alemão e o tradutor.
Vocês estão em uma reunião, você não fala alemão e o alemão não fala português. Mas existe uma terceira pessoa que fala ambas as línguas. É como se eu fosse o algoritmo e o alemão o computador e o tradutor seria o compilador. Eu posso estar falando a mesma coisa que o alemão, porém, não conseguimos nos entender por conta da barreira de linguagem e é ai que o tradutor entra em jogo, traduzindo do português para o alemão e assim fazendo com que nós dois entremos em um acordo e todo mundo se entende.
Voltando ao mundo dos algoritmos... esse código escrito numa linguagem de programação deve ser transformado num programa executável num computador, portanto esse programa deverá ser compilado (chamado de processo de validação da sintaxe utilizada) e linkeditado (chamado de processo de montagem do programa executável).
O processo de criação de um programa deveria seguir essa lista (mas nem sempre isso ocorre ou ocorre dessa forma e nessa ordem), vocês vão aprender sobre esse ciclo nas aulas de engenharia de software, então prestem atenção nessas aulas (se caso o seu curso oferece essa matéria).
Análise do problema
Projeto do programa
Implementação
Testes
Verificação
A intenção de criar um programa geralmente é para resolver um problema. E o primeiro passo para se resolver isso é compreendê-lo completamente. O nosso instinto é de tentar resolver a coisa toda de uma vez só o que gera frustrações e desistência, principalmente nas primeiras aulas de algoritmos ou de qualquer outra linguagem de programação.
Nesse processo de compreensão é importante fazer rascunhos, escrever e fazer brainstorms. Sério, vá em um papelaria e comprei um caderninho para você, bote um apelido nele, chame de lindo e cuide bem dele. Eu sei que você tem bloco de notas no computador, mas acredite, esse método oldschool é muito mais eficaz.
E quando você estiver rascunhando, pare, pense e faça perguntas para si mesmo como:
“O que eu sei até agora?"
"O que falta descobrir ou calcular? E qual será o objetivo disso?”
"O que eu tenho disponivel de dados? São suficientes?”
Dentre outras perguntas... E óbvio, anote tudo, inclusive suas respostas.
Faça gráficos e tudo o que você sentir que deve ser feito, tudo para facilitar seu trabalho na resolução do problema. E assim você dá um ponta pé inicial nessa compreensão para chegar numa estratégia.

O algoritmo nada mais é que uma forma de representar a lógica que queremos passar, como tudo nessa vida, devemos parar e pensar por etapas, então rascunhos são importantes, como quando começamos a aprender matemática e usavamos aqueles pauzinhos para poder ajudar a fazer aquela conta matemática fazer algum sentido em nossas cabeças.
Então antes de construir o algoritmo, precisamos definir uma estratégia.
Estratégia > Algoritmo > Programa
E para montarmos uma estratégia temos que ser inteligentes e pensar em modos de facilitar nossas vidas, como vamos ver mais para frente nas aulas de banco de dados, algumas querys que usamos não são tão eficientes quando rodamos pela primeira vez, principalmente se não colocados as clausuras de “filtramento” corretamente, isso fará o uso desnecessário da memória, quando pegamos um atalho, tudo fica mais rápido e fácil.
Então quando vamos criar uma estratégia, pense se você já resolveu algum problema similar. Se sim, qual? E tente customizar essa solução para se adequar a este novo problema.
Você pode aproveitar como referência, provavelmente você precisará introduzir novos elementos ou modificar os existentes. É por isso que eu sempre digo que em toda a minha carreira eu nunca usei muita matemática, pois geralmente a fórmula que eu preciso já existe em algum lugar na internet e se você pode facilitar o seu trabalho, porque não?
A solução está ai e isso não te faz menos inteligente. Te faz poupar tempo e se caso a solução não exista em lugar nenhum... Trate de documentar e compartilhar com a comunidade, pois, COM TODA A CERTEZA você vai usar da ajuda virtual em algum ponto de sua vida. Então vamos compartilhar o pão com os irmãos!
Agora, se esse é um problema muito complexo e complicado, que você não consegue achar alguma solução, referência ou problemas parecidos já trabalhado antes, a melhor maneira é quebrar o problema em partes.
Voltando ao exemplo da montagem do móvel, temos que montar uma comoda, como eu montei semanas atrás em minha casa. Você não consegue montar sozinho o negócio todo de uma vez só, é preciso fazer por partes.
Primeiro se monta a estrutura de baixo, depois se encaixam as laterais e assim a parte superior. E por final, você pode montar cada gaveta. No fim do processo, você tem a comoda completa e encaixada, já que você fracionou o problema em partes.
Você quebrou o problema em partes menores e de solução mais simples.
E mais uma vez, não tem uma ordem especifica e talvez sua solução não é a mais rápida e eficiente, porém, resolve o problema.
Uma frase que o Surian disse e que eu nunca vou esquecer
“Descer uma escada de costas é bem mais complicado do que da maneira natural e chegamos sempre ao mesmo lugar.”
Como eu disse, rascunhar é essencial inclusive para saber se a sua lógica realmente faz algum sentido e isso se chama “Teste de Mesa” ou “Simulação”.
1. Escreva em um papel um algoritmo informal com instruções que em sua cabeça fazem sentido ou que talvez pareça resolver seu problema.
2. Em seguida verifique se cada passo desse algoritmo está correto o simulando.
3. Identifique os erros e os trate um por vez, sem nunca perder de vista o objetivo real do programa.
Esse processo ordenado logicamente faz você aprender a desenvolver soluções.