No internet connection
  1. Home
  2. Dúvidas Gerais

Dicas para projetos - Funções Recursivas - Cuidado com a Pilha de Execução

Por Lucas Ferreira @lksferreira
    2022-12-18 20:47:15.932Z2022-12-19 16:13:49.397Z

    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...

    • 21 respostas

    There are 21 replies. Estimated reading time: 4 minutes

    1. Larissa Leal @LariLeal
        2022-12-19 15:30:59.781Z

        Ó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

        1. Lucas Ferreira @lksferreira
            2022-12-19 15:46:45.110Z

            Obrigado pelo feedoback, vou melhorar essas questões nos próximos.

            1. Larissa Leal @LariLeal
                2022-12-19 19:56:05.682Z

                :D

              • Em resposta aLariLeal:
                Lucas Ferreira @lksferreira
                  2022-12-19 16:14:40.557Z

                  Prontinho, fix com sucesso, da uma olhada la

                  1. Larissa Leal @LariLeal
                      2022-12-19 19:55:55.940Z

                      Boaa, facilitou muito para mim
                      Ensinar sempre é algo difícil né, obrigada por ouvir o feedback !!

                  2. Em resposta alksferreira:
                    André Filipe @andresantos
                      2022-12-19 04:42:04.260Z

                      Esse 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.

                      1. Lucas Ferreira @lksferreira
                          2022-12-19 11:19:21.673Z

                          Sim, 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 @Alisson
                            2022-12-19 11:53:15.710Z

                            Muito bom, mestre! Ficarei na cola desse conhecimento todo!

                            1. Lucas Ferreira @lksferreira
                                2022-12-19 12:01:24.207Z

                                Obrigado pelo feedback xD

                              • J
                                Em resposta alksferreira:
                                Jeferson Kindrajh @Jefersonk
                                  2022-12-19 12:23:10.754Z

                                  Lucas,

                                  Mais uma vez um excelente postagem e com muita qualidade. Certamente suas dicas estão me ajudando nessa jornada!

                                  Parabéns!

                                  1. Lucas Ferreira @lksferreira
                                      2022-12-19 12:44:35.361Z

                                      Obrigado por ler, xD

                                    • Em resposta alksferreira:
                                      Lucélia Batista @Luceliabatista
                                        2022-12-19 13:28:56.309Z

                                        Ual, que artigo detalhado e incrível! Parabéns, e obrigada por compartilhar esse seu conhecimento.

                                        1. Lucas Ferreira @lksferreira
                                            2022-12-19 14:06:18.102Z

                                            Oi de novo, esse assunto é muito bacana e bem avançado, se você entendeu parabéns continua assim, esta no caminho certo.

                                          • Em resposta alksferreira:

                                            Adoreeeei, 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!!

                                            1. Lucas Ferreira @lksferreira
                                                2022-12-27 12:37:53.790Z

                                                Obrigado pelo feedback, assim que as coisas estiverem mais tranquila vou fazer mais publicações

                                              • Em resposta alksferreira:
                                                Bruno Coelho @BrunoCoelho
                                                  2022-12-27 12:50:38.798Z

                                                  Parabéns Ferreira pelo artigo!! Muito esclarecedor e enriquecedor!
                                                  To aqui absorvendo os conhecimentos.

                                                  1. Lucas Ferreira @lksferreira
                                                      2022-12-27 18:36:06.570Z

                                                      Eu que agradeço o feedback, já estou escrevendo o próximo.

                                                    • Em resposta alksferreira:
                                                      Jéssica Cirne @jessicacirne
                                                        2022-12-27 14:03:23.974Z

                                                        Massa!! 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 !

                                                        1. Lucas Ferreira @lksferreira
                                                            2022-12-27 18:37:28.254Z

                                                            Obrigado pelo apoio, logo logo o próximo sai.

                                                          • T
                                                            Em resposta alksferreira:
                                                            Thiago Nebuloni @thiagonebuloni
                                                              2022-12-18 21:17:16.607Z

                                                              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!

                                                              1. Lucas Ferreira @lksferreira
                                                                  2022-12-18 22:59:06.839Z

                                                                  Hello @thiagonebuloni ,

                                                                  Obrigado pelo feedback, qualquer coisa é só chamar.