Jump to content
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.

Share this post


Link to post
Share on other 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));

 

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Vinicius Bazan
      Estou tendo um problema em elaborar o meu código com javascript, estou fazendo um teste em html e css simples pra depois elaborar um website, o objetivo aqui é fazer um relógio pelo JS e ter um contador em baixo desse relógio que vai pegar valores a partir de um switch para esse contador funcionar, isso porque se trata de dados sobre tipos de agressões contra as mulheres, então os cases do switch tem o dado em segundos para executar a formula, uma mensagem inicial e uma mensagem final.
       O usuário teria dois botões, um de cada lado (nesse caso estou usando 2 div com as ID's #btd e #bte, ao apertar esses botões aumentaria o valor de uma variável em +1 ou -1 e isso faria o switch escolher outro case e trocar os dados do contador, mas os dados não são trocados, mantendo as informações iniciais.
       Ao todo tem 4 funções, a função relogio(), contador(), btd() e bte(), sendo que a btd e bte estão dentro da contador() 
       Estou colocando o codigo dentro do spoiler, se alguém puder me ajudar a achar alguma solução agradeço
       
      OBS: Eu nem sei se pode ter uma function dentro da outra, mas como estou aprendendo JS ainda, imagino que assim como outras estruturas (If, Else, Switch, etc...) possa ser possível colocar uma função dentro da outra.
       
       
    • By Vinicius Bazan
      Galera to com uma duvida aqui, no javascript é possível fazer uma função dentro de outra e uma acessar os valores de uma var da outra?
       
      Por exemplo digamos que eu tenha uma function a() e uma function b(), eu preciso que a function a utilize valores de variáveis que estarão na function b, se isto for possível a função b terá que estar dentro de a ou seria ao contrario?
    • By camisbales
      Olá,
      preciso resolver o seguinte exercício:
      Uma professora de programação, cansada de que os estudantes cheguem tarde, decidiu que vai cancelar a aula se há poucos presentes.
      Ela representa a entrada dos estudantes como um array de tempos de chegada tarde, em minutos. Por exemplo, se um estudante chegou 10 minutos atrasado, outro 5 minutos antes da hora, outro com 3 minutos de atraso, e outro pontual, poderá representar assim:
      var alunosDaSegunda = [10, -5, 3, 0];
      Com essa informação e a quantidade mínima de estudantes para que suceda o curso, a professora quer saber se a aula acontecerá. Por exemplo, supondo que a quantidade mínima de estudantes para que a aula aconteça é de 2 alunos, então o curso da segunda-feira se realizará, porque houve um estudante que foi pontual e um estudante que chegou cedo.
       acontece(alunosDaSegunda, 2)
      true
      Mas se a quantidade mínima fosse 3, a aula não aconteceria:
       acontece(alunosDaSegunda, 3)
      false
      Escreva as seguintes funções: 1. acontece, que diz se a aula sucederá de acordo com o array dos estudantes que entraram. 2. aberturas, que utiliza um array com os arrays dos estudantes que entraram nos outros dias, e a quantidade mínima de estudantes, e diga quais os dias em que as aulas aconteceram e quais não. Por exemplo:
      aberturas([alunosDaSegunda, alunosDaTerça, alunosDaQuarta], 2)
      [true, false, false]
      A seguir o código que eu escrevi e os erros apresentados:
      function acontece (alunosDia, quorum){
          let resultado = [];
          for (let i = 0; i < alunosDia.length; i++){
          if (alunosDia <= 0){
          resultado.push (alunosDia);}
          if (resultado.length >= quorum) {
          return true;}
          }
      }
          
      function aberturas (alunosDia, quorum){
          let resultadoArray = [];
          for (let i = 0; i < alunosDia.length; i++){
          resultadoArray.push(acontece(alunosDia, quorum));
          }
      }
      ERROS
      acontece([10, -5, 3, 0], 4) - deveria retornar false;
       acontece([10, -5, 3, 0], 3 - deveria retornar false;
       aberturas([[0, 0, 3, 0], [1, 2, 4, 5], [0, 0, -1]], 3) - undefined deepEqual [ true, false, true ];
       aberturas([[0, 0, -3, 0], [1, 2, 4, 5], [0, 0, -1]], 4) - undefined deepEqual [ true, false, false ].
       
    • By carlosguimaraes1801
      Olá,
       
      Gosto muito de programação, mas comecei a programar a pouco tempo.
      Recentemente decidimos fazer uma grande modificação no site da empresa na qual sou sócio.
       
      Deu tudo certo, mas achei uma limitação no LearnPress, o plugin de gerenciamento de cursos que utilizamos. Gostaríamos de exibir os preços parcelados abaixo do valor integral de cada curso cadastrado no LearnPress.
       
      Como não encontrei nenhum add-on ou algo pronto na internet, criei a seguinte function que calcula o preço parcelado de cada curso, com valor mínimo da parcela de R$9,00 e a adicionei ao arquivo functions.php do Wordpress.
       
      Eu testei a function e ela funcionou perfeitamente.
       
      <?php /*------------------CALCULA O PREÇO PARCELADO------------------*/ function installment_price_course($nparcelas, $sale_price) { $sale_price = (float)$sale_price; $pparcelado = $sale_price/$nparcelas; if ($sale_price < 9) { $nparcelas = 1; $pparcelado = $sale_price; echo $nparcelas.' x R$ '.number_format($pparcelado, 2, ",", ".").' sem juros'; } else { if ($pparcelado >=9) { $nparcelas = 12; echo $nparcelas.' x R$ '.number_format($pparcelado, 2, ",", ".").' sem juros';} else { for ($nparcelas = 12; $nparcelas >= 1; $nparcelas--) { $pparcelado = $sale_price/$nparcelas; if ($pparcelado >= 9) { break; } } echo $nparcelas.' x R$ '.number_format($pparcelado, 2, ",", ".").' sem juros'; } } } /> No entanto, ao chamar a function com os parâmetros (12, $price) aparecem o seguinte erros:
       
      Warning: A non-numeric value encountered in /home/.../eduma-child/functions.php on line 101 1x R$ Warning: number_format() expects parameter 1 to be float, string given in /home/.../eduma-child/functions.php on line 106 sem juros  
      Pensei que poderia ser que a variável $price fosse uma string. Então inseri o seguinte trecho na function para converter a string em float:
      <?php $sale_price = floatval($sale_price); ?> Após inserir esse trecho o erro desapareceu mas o valor parcelado mostrado é 0. O estranho é que se eu substituo o parâmetro variável por um número qualquer, ele retorna o valor parcelado corretamente.
       
      Segue o código da página de curso.
       
      <?php defined( 'ABSPATH' ) || exit(); $user   = LP_Global::user(); $course = LP_Global::course(); $class = ''; $class .= ( $course->has_sale_price() ) ? ' has-origin' : ''; if ( $course->is_free() ) {     $class .= ' free-course'; } if ( ! $price = $course->get_price_html() ) {     return; } ?> <div class="course-price">     <div class="value <?php echo $class;?>">         <?php if ( $course->has_sale_price() ) { ?>             <span class="course-origin-price"> <?php echo $course->get_origin_price_html(); ?></span>         <?php } ?>         <?php echo $price; ?>     </div>     <span style="font-size: 14px; font-weight: normal"><?php installment_price_course (12, $price);?></span> </div> ?>  
      --------- Atualização ---------
      Também notei que se eu defino uma variável $price2 e atrubuo um valor qualquer a ela, posso usá-la sem problemas como parâmetro da function. Ex.:
       
      (installment_price_course (12, $price);  
      Além disso, a variável $price está ok e ela mostra o preço integral do curso normalmente. Testei-a com o echo $price e está ok.
       
      ------------------
       
      Alguém poderia me ajudar? Será que isso que estou tentando fazer de colocar uma variável na chamada da function é incorreto?
      Preciso muito solucionar este problema.
       
      Desde já agradeço a atenção de todos.
    • By Icaro Luan
      error
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.