Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

snowstormdelivery

Como saber quando devo usar recursão ou iteratividade?

Recommended Posts

Estou praticando exercícios de recursão, mas eu notei que variáveis locais se repetem muito, enquanto uma iteração não faz isso.
Isso prejudica o desempenho do programa, de alguma forma?

Eu só postei aqui, porque no Google está difícil de compreender. Se alguém puder ser mais claro, eu agradeço.

Como saber quando devo usar recursão ou iteratividade?

Olhem o as variáveis repetidas:

 

pAQ5aQl.png?1

 

Atualização: Li mais, mas continuo com alguns conceitos vagos. Quem quiser dar sua opinião, vai me ajudar!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Recursão é sempre melhor do que iteração porque não consome tanta memória. Dependendo de como a linguagem gerencia a criação de variáveis, uma iteração vai criar um contador e um controle de laço, enquanto a recursão vai alocar o mesmo espaço da memória e utilizá-lo várias vezes seguidas alterando seu valor a cada passada.

 

Sempre que for necessário realizar uma tarefa repetitiva que utilize os mesmos recursos constantemente, ou então algo que realize a mesma tarefa várias vezes seguidas, opte sempre por recursão. Um bom exemplo é o algoritmo fatorial (n!), existem modos de fazê-lo por iteração ou por recursão, mas se você criar um algoritmo dos dois modelos na mesma linguagem e depois rodar um profile de memória, você verá que a iteração consome muito mais tempo de processamento e memória do que uma função recursiva.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu li que a recursão é bom por causa da "elegância" que gera no código e algumas vezes dá performance, mas essa repetição de variáveis, na recursividade, é como uma pilha de documentos que vai crescendo e depois se desempilha e, caso ela seja muito grande venha a dar erro. Um conhecido erro, chamado "StackOverFlow.

Agora estou confuso, porque se a recursão for muito grande ou mesmo pequena, essa pilha não iria atrapalhar a execução mais que uma iteração?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não, a recursão não gera uma pilha na stack, pelo contrário, ela reduz o uso da stack na função. Ela só vai causar StackOverflow se você ficar sempre inicializando um novo objeto ou uma nova instancia a cada iteração da recursão, dessa forma ele sempre vai inicializar outra instancia e não vai nunca dar dispose. Desta forma os objetos vão ser alocados sem parar.

 

Por definição, não se usa variáveis instanciadas em uma recursão, ou se usar seria válido destruir a mesma no final da iteração para evitar esses tipos de erros.

Compartilhar este post


Link para o post
Compartilhar em outros sites

pelo que aprendi sobre isso com um professor da faculdade ele disse que a recursividade cria uma nova camada da mesma variável, tipo memória em pilha, e por isso não era mais útil usar recursividade...apenas em casos de algoritmos de calda(não sei o que é isso!).

Compartilhar este post


Link para o post
Compartilhar em outros sites

pelo que aprendi sobre isso com um professor da faculdade ele disse que a recursividade cria uma nova camada da mesma variável, tipo memória em pilha, e por isso não era mais útil usar recursividade...apenas em casos de algoritmos de calda(não sei o que é isso!).

 

Hoje em dia já cheguei a esta mesma conclusão, por isso acredito que o Khaos talvez estava em dúvida, também.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por YanSilveira
      Galera, estou com uma dúvida muito grande em como posso implementar uma função de uma PG (Progressão Geométrica) via recursividade de  cauda, visando achar o e-nésimo termo da mesma. (C#).
      Alguém pode me ajudar?
       
      Obrigado desde Já.
    • Por Matheus Guermandi Ribeiro
      tabela Chamado
          idChamado
          dataChamado,
          statusChamado,
          descricaoChamado,
          tituloChamado,
          idChamadoPai,
          idRemetente,
          idDestinatario
       
      function historicoChamado($idChamdoFilho) {
          static $ArrayIdChamadoPai = array();
          global $link;
          $cmdAux = "SELECT
                 idChamadoPai
                 FROM Chamado 
                 WHERE idChamado = '$idChamdoFilho'";
          $resultAux = mysqli_query($link, $cmdAux);
          $dadosAux = mysqli_fetch_array($resultAux);
          $idChamadoPai = $dadosAux['idChamadoPai'];
          if ($idChamadoPai != NULL) {
              array_unshift($ArrayIdChamadoPai, $idChamadoPai);
              historicoChamado($idChamadoPai);
          } else {
              return $ArrayIdChamadoPai;
          }
      }
       
       
       
      Preciso que esse array retorno todos os idChamadoPai. Já tentei colocar o ArrayIdChamadoPai como global mais tbm não funciona. Quem puder ajudar salvaria muito 
    • Por adrian.campana
      Olá pessoal, sou novo na comunidade e preciso de uma ajudinha.
      Comecei a pouco tempo na programação, preciso fazer um código da sequência de Fibonacci sem usar recursividade. Eu fiz um usando recursividade e ficou assim:
       
      <?php
      function fib($n){
          if($n == 0){
          return 0;
      }     elseif($n == 1 || $n == 2) {
          return 1;
      }    else {
          return fib($n-1)+fib($n-2);
      }
      }
      for($i=0; $i<=15; $i++){        
          echo fib($i)."<br>";
      }
      ?>
       
      Agora preciso fazer a mesma coisa, mas sem usar recursividade.
    • Por alvorac
      Pessoal sou iniciante em mysql e to meio perdido, preciso fazer uma consulta entre duas tabelas PERFIL e Questoes, vou tentar explicar o caso :
       
      São 5 Tabelas:
      Series: Guardam 12 series do ensino fundamental ao ensino médio
      Tipo: Classificam as questões em niveis de dificuldade de 1 a 20, e um tempo medio que a questao deve ser respondida
      Questões: Uma matriz de questões distribuídas para cada ano e tipo
      Exemplo:
      Questão 1 + 1 = 1, TIPO:1 ANO: 1…Tipo N Ano N.

      Agora vem as tabelas auxiliares
      Disciplina: Guarda as disciplinas como matematica, portugues, …
      Perfil: (Essa tabela é o parametro para gerar os questionarios)guarda o total de questoes conforme a disciplina, considera-se que para um numero sequencial de questões normais, havera ou não uma correspondencia de uma questão extra, há uma tolerancia de erros, para cada disciplina, exemplo matematica pode errar uma de cada tipo, porem essas ligações pensei de fazer via programação.


      Exemplo: Matematica = Pode errar 1 vez, se o aluno responder uma questão do tipo 3 errada, sera substituida por outra do mesmo tipo. no segundo erro, termina a prova e encerra a resposta do questionario.

      Sobre o Questionario:
      Dado de parametros a Disciplina, tenho o perfil de questões para o questionário( DISCIPLINA, ANO e TIPO e suas respectivas quantidades de questões normais e questões extra), a SQL então deve retornar as questões que atendam as exigencias de QUANTIDADE (NORMAL E EXTRA) CONFORME Os TIPOS cadastrados em PERFIL.
       
      Minha tentativa foi com esse codigo (sem sucesso):
       
      SELECT COALESCE(CatParent.id, Questoes.id) id, COALESCE(CatParent.enunciado, Questoes.enunciado) enunciado, perfil.tipo_id FROM perfil JOIN Questoes ON perfil.tipo_id = Questoes.tipo_id and Questoes.ano_id = perfil.ano_id LEFT JOIN Questoes AS CatParent ON Questoes.tipo_id = CatParent.id ORDER BY RAND( ) group by id, enunciado, tipo_id Não sei como limitar a quantidade consideando o total de questões Normais e Questões extra de forma dinamica cada vez que ele busca tais questões, é possivel? como fazer?  ajudem por favor.
       
      Grato
       
       
      Demonstração em valores da Tabela Perfil , as questões e o Questionário resultado da consulta.


    • Por danield1591998
      Olá, construi um cronometro que funciona muito bem a base de JavaScript, ele funciona através de uma função recursiva que vai decrementando os segundos, minutos e horas...
      Entretanto quando eu clico em outra aba o relógio para e quando eu volto ele começa de onde tinha parado. Eu quero que ele continue contando o tempo mesmo que eu mude de aba. Como proceder?  
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.