Dicas para projetos - Funções Recursivas - Cuidado com a Pilha de Execução
long artigo = publicacao.Ferreira;
Hello Devs,
Ferreira aqui mais uma vez, este é o primeiro artigo que escrevo após liberarem o rank, portanto parabéns a todos que se destacaram, mas não se esqueçam, mais importante que farmar pontos, é farmar conhecimento, e é por isso que meus artigos são desse tamanho, então já sabem, pega uma coquinha bem gelada, se arruma ai na sua cadeira gamer, e vem comigo porque esse vai ser grande, pra quem pegou a referência da primeira linha, meus parabéns dobrado.
Tudo começou em uma fatídica tarde de segunda-feira, quando resolvi iniciar o Projeto de Sistema Bancário, pensei comigo: "Humm, Esta ai uma bela oportunidade de aplicar o que venho estudando, será que dou conta?".
Dica number one:
Se você não fez ou não iniciou esse projeto de sistema bancário: FAÇA, cada etapa é um processo, as coisas não acontecem só porque você tem vontade, elas vão acontecer quando você transformar essa vontade em uma AÇÃO. Justamente por isso é a dica número um, todo projeto teve um início, todo programa teve um ponto de partida, nem que seja só para criar o repositório no GitHub, ou só a pasta onde será salvo seu projeto, dê o primeiro passo.
Dica number two:
Abstraia seu projeto, já falamos sobre isso, lembra? Abstrair nada mais é do que pegar um problema grande e transforma-lo em diversos problemas pequenos, inclusive os norte-americanos tem uma expressão pra isso: Baby steps, ou seja, dê passinhos de bebê, escreva um pouquinho seu código hoje, um pouquinho amanhã, depois de amanhã implemente uma função aqui, no outro dia um método acolá, e assim por diante, o mais importante é não ficar parado.
Dica number three:
Interaja com quem está passando pelo mesmo que você, isso faz muita diferença, e como faz!! Quando eu digo interagir não é mandar e-mail para pessoa, nem entrar aqui no fórum e trocar mensagens, minha definição para essa dica é interaja em tempo real com essas pessoas, pode ser por vídeo chamada, telefone, WhatsApp, mas eu tenho certeza que você tem um baita ferramenta feita pra isso, chamada DISCORD, e por favor em... não vem me falar que ficar assistindo eu transmitir minha tela vale como interação, a via tem que ser de mão dupla.
Bom, vamos para o prato principal?
Até perdi o fio da meada, a sim, resolvi portanto abrir meu próprio banco, e decidi começar pelo sistema administrativo, mas por onde começar? O perguntinha capciosa... Optei por desenvolver esse Sistema Bancário com métodos e funções, e existem um tipo especial de função chamada Função Recursiva, não é nada mais do que uma função que chama a si mesma, e foi nisso que você pensou:
.
.
.
.
.
.
.
.
.
.
.
.
Ufa !!, esconde esse GIF, estava ficando zonzo, e é exatamente isso que vai acontecer caso você crie um método que chame por si mesmo, mas fique sussa, a solução para esse problema é a mesma do Laço de Repetição, você deve incluir uma condição de parada.
Vamos entender como uma Função Recursiva que calcula o fatorial de um número funciona:
Para não prejudicar aqueles que não prestaram atenção ao lance, vamos mostrar novamente com a magia do replay imediato.
Bom, meu problema não estava exatamente em um loop infinito, e sim em stack de execução infinita, eu tinha um Método A, que chamava um Método B, que chamava um Método C, que por sua vez chamava o Método A novamente.
Mas onde esta o erro nisso ai?
Simplesmente dessa forma nunca existirá o desempilhamento das execuções, e o programa aparentemente funcionaria como deve, mas em algum momento durante o uso, a pilha de chamados ficará tão grande que ocorrerá um estouro de memória.
Levei um dia para perceber o erro, acontece que nesse caso em que utilizei um do_while, devo obrigatoriamente especificar um caminho para desempilhamento quando ele ocorrer, e se repararem eu condicionei o do_while (true), ou seja, mesmo que houvesse o desmonte da pilha de execução no momento em que o Runtime passasse por esse loop ele ainda ficaria preso, e o programa não teria o comportamento esperado.
A correção foi mais fácil do que encontrar o problema, tanto é que aqui estou eu escrevendo mais um textão para você.
Desse jeito, toda vez que oRuntime passar por esse loop, caso a condição seja falsa ele não acumulará mais as chamadas das funções na stack de execução infinitamente.
E caso você tenha lido até aqui, o meu muito obrigado e um meme de presente. (Dessa vez escolhido pelo meu sobrinho Murillo :D).
Deixem seus feedback...
Larissa Leal @LariLealÓtimo artigo! Só uma observação: seria interessante deixar os gifs mais longos quando tem frases dentro, as vezes uma frase muito longa sai rápido, ficando ruim para ler. Um vídeo também seria interessante, já que seria possível a opção de pausar para ler a frase :)
Valeu pelo post
Lucas Ferreira @lksferreiraObrigado pelo feedoback, vou melhorar essas questões nos próximos.
Larissa Leal @LariLeal:D
- Em resposta aLariLeal⬆:
Lucas Ferreira @lksferreiraProntinho, fix com sucesso, da uma olhada la
Larissa Leal @LariLealBoaa, facilitou muito para mim
Ensinar sempre é algo difícil né, obrigada por ouvir o feedback !!
Em resposta alksferreira⬆:André Filipe @andresantosEsse tipo de função merece nossa atenção e é bom a criação de pequenos exemplos como esse do fatorial até o completo entendimento. Receber um erro de loop infinito após implementação de um extenso código é dureza. Muito boa sua publicação.
Lucas Ferreira @lksferreiraSim, o mais legal é que erro de loop infinito geralmente permite o funcionamento da aplicação, e a gente só descobre na hora H. hahah
Em resposta alksferreira⬆:Alisson Meireles @AlissonMuito bom, mestre! Ficarei na cola desse conhecimento todo!
Lucas Ferreira @lksferreiraObrigado pelo feedback xD
- JEm resposta alksferreira⬆:Jeferson Kindrajh @Jefersonk
Lucas,
Mais uma vez um excelente postagem e com muita qualidade. Certamente suas dicas estão me ajudando nessa jornada!
Parabéns!
Lucas Ferreira @lksferreiraObrigado por ler, xD
Em resposta alksferreira⬆:Lucélia Batista @LuceliabatistaUal, que artigo detalhado e incrível! Parabéns, e obrigada por compartilhar esse seu conhecimento.
Lucas Ferreira @lksferreiraOi de novo, esse assunto é muito bacana e bem avançado, se você entendeu parabéns continua assim, esta no caminho certo.
Em resposta alksferreira⬆:Carolina Castilhos @carolinacastilhosAdoreeeei, Lucas!!! Ainda preciso de muuuito estudo pra aprender mais de funções, mas já me deu um caminho, muito obrigada <3 consegui entender, principalmente o gif, gostei muito do passo a passo dentro dele mostrando como estava acontecendo!!
Lucas Ferreira @lksferreiraObrigado pelo feedback, assim que as coisas estiverem mais tranquila vou fazer mais publicações
Em resposta alksferreira⬆:Bruno Coelho @BrunoCoelhoParabéns Ferreira pelo artigo!! Muito esclarecedor e enriquecedor!
To aqui absorvendo os conhecimentos.
Lucas Ferreira @lksferreiraEu que agradeço o feedback, já estou escrevendo o próximo.
Em resposta alksferreira⬆:Jéssica Cirne @jessicacirneMassa!! Suas postagens são sempre bem detalhadas e bem feitas, tenho ctz que ajudam a muitos por aqui!! Parabéns pelo trabalho e esforço !
Lucas Ferreira @lksferreiraObrigado pelo apoio, logo logo o próximo sai.
- TEm resposta alksferreira⬆:Thiago Nebuloni @thiagonebuloni
Que maravilha de artigo hein! Parabéns!
Funções recursivas são o tipo de coisa que conseguem dar um nó na cabeça. A primeira vez que vi demorei pra entender. Agora estou entendendo uns 10% kkkkk
Mentira, com esse artigo aumentou pra uns 50%.Obrigado Lucas!
Lucas Ferreira @lksferreiraHello @thiagonebuloni ,
Obrigado pelo feedback, qualquer coisa é só chamar.