Ir para conteúdo

Arquivado

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

Sapiens

Função Recursiva em Javascript

Recommended Posts

Alguém poderia me tirar uma dúvida !

function recursiveFatorial(x){
if (x == 0)
	return 1;
else
	return x * recursiveFatorial(x-1);
}

console.log(recursiveFatorial(10));

/*
Output
10! 10 x 9 x 8 x 7 x 6 x 5 x 4 x 3 x 2 x 1 =  3628800


1x Que o codigo rodar, o valor de X = 10 e o resultado da expressao return 10 * recursiveFatorial(10-1); = 3628800
2x X = 9 return 9 *  recursiveFatorial(9-1); = 40320
3x X = 8 return 8 *  recursiveFatorial(8-1); = 5040
4x,5x,6x... e assim por diante, minha dúvida é:quando terminar de rodar o código na 9x(ou quando o index X for = 1) o resultado que a expressao -> [ return 1 *  recursiveFatorial(1-1); ] vai retornar tem o valor de 1, na proxima vez que o codigo rodar X vai ter o valor de 0 ! Então a condição (x == 0) vai ser true e retornar 1; e não o resultado que está sendo printado no console de 3628800 !  Gostaria de saber  aonde está sendo "armazenado" esse valor 3628800!

*/

Não sei se consegui explicar direito!  De qualquer forma se alguém poder me ajudar entender como o console esta emitindo esse valor ficarei muito grato. 

Muito obrigado,
Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Citar

Gostaria de saber aonde está sendo "armazenado" esse valor 3628800!

 

está "em memória", o valor final está na conta: 

x * recursiveFatorial(x-1)

 

execute assim:

function recursiveFatorial(x){
  if (x == 0) {
    return 1;
  } else {
    var result = x * recursiveFatorial(x-1);
    console.log('x:', x, ' result:', result);
    return result;
  }
}
console.log(recursiveFatorial(10));

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cada vez que a função é chamada, é alocado um quadro na pilha de chamada, gastando mais memoria a cada nova chamada. Toda essa memória só é liberada quando todas as chamadas recursivas alcançam o ponto de parada (quando x for igual a 0, no seu exemplo).

De uma olhada nesse link
https://pt.wikipedia.org/wiki/Pilha_de_chamada
 

Adicional:
Caso a função recursiva faça chamadas demais a si mesma (acumule "quadros" demais na pilha) vai ocorrer um "Stack Overflow" (estouro de pilha)


Para sequência simples que não precise da complicação da recursão, o ideal é usar laços, a não ser que a linguagem em questão não tenha esse recurso (há quem discorde).
Se não é óbvio que você deveria usar recursão, é provável que não deva usar mesmo

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por mateus.andriollo
      Boa tarde,
      Tenho alguns campos numéricos q ao fazer uma select gostaria q retornasse uma legenda
       
      exemplo:
      Status: 0=Inativo / 1=Ativo Condição: 1=Funcionando / 2=Em manutenção / 3=Manutenção Interna   
      Seria algo assim, tenho varias tabelas com estes campos... mas tenho q ficar usando replace.
      Existe uma forma de criar uma função para isso? Nem q na função eu tenha que setar nome do campo, ficando assim:
      Legenda('Status',cadastro.status) 
    • Por Luiz Henrique
      Olá pessoas,
       
      Tenho uma classe e dentro dela várias chamadas para métodos de acordo com a necessidade em outra classe (para obter dados DB), como são muitas e vou duplicar os arquivos, para ganhar tempo queria colocar o nome da classe em uma variável porém não funciona.
       
      use Class1; class Class2 { public $className = 'Class1'; ... $dados = $this->className::function(); // não funciona } Era para gerar isso:
      $dados = Class1::function();
      Se eu der um echo $this->$className, ele me retorno o nome da Class1 porém para executar um método dentro da Class1 não vai, diz que a classe Class1 não existe!
      Tem alguma forma de funcionar isso?
       
      Obrigado.
    • Por ernestovm
      Bom dia.
      Descobri, depois de muito trabalho, um problema esquisito. Tenho duas imagens que chamam funções JavaScript determinadas. Uma funciona e a outra não. Isso no Firefox. No Chrome as duas funcionam perfeitamente. Alguém conhece alguma gambiarra para fazer o Firefox funcionar? Segue os códigos:
      HTML:
      <img src="images/ic_abrir.png" width="70" height="70" onClick="abre_notificacao(<? echo "'".$us_codigo."','".$item."'"; ?>);" style="cursor:pointer" id="p_imagem-<? echo $item; ?>" name="p_imagem-<? echo $item; ?>">
       <img src="images/ic_excluir.png" width="70" height="70" onClick="excluir_notificacao(<? echo "'".$us_codigo."'"; ?>);" style="cursor:pointer">
      JAVASCRIPT:
      <script type="text/javascript">
          function abre_notificacao(codigo,indice) {
              $("#p_imagem-"+indice).attr("src","images/ic_abrir_ok.png");
              $("#ver-"+indice).css("display", "block");
          }
          function excluir_notificacao(codigo) {
              $.post("excluir_notificacao.php", {codigo: codigo}, function(resposta) {
                  confirm(resposta+" ("+codigo+")");
              });
              location.reload();
          }

      </script>
      A Função abre_notificacao(codigo,indice)  funciona perfeitamente nos dois browsers.
      A Função excluir_notificacao(codigo) só funciona no Chrome.
      Obrigado pela luz
    • Por unset
      Olá, estou começando a usar o twig template e estou com uma dúvida e não encontrei a resposta também não sei se é possível mais espero que seja possível
       
      Bom eu tenho um arquivo com várias funções, como eu faço para chamar essas funções no HTML?
       
      Não funciona assim {{ funcao() }}
    • Por Luiz Henrique
      Olá,
      Existe alguma forma de executar a função dentro da mesma?
      EX:
       
      function pai(){
          pai();
      }
       
      Obrigado.
×

Informação importante

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