Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Solucionado (ver solución)
Solucionado
(ver solución)
3
respuestas

[Duda] Función Factorial

Hola a todos.
Me encuentro haciendo el segundo curso de lógica de programación: "Funciones y listas", y tengo una duda con el siguiente código (pregunta 2 del desafío):

function calcularFactorial(numero) {
if (numero === 0 || numero === 1) {
return 1;
} else {
return numero * calcularFactorial(numero - 1);
}
}
// Ejemplo de uso
let numero = 5;
let resultado = calcularFactorial(numero);
console.log(El factorial de ${numero} es ${resultado});

Comprendo el if y todo eso, pero no comprendo cómo esa función se ejecuta, si nunca se especificó qué debe hacer (no sé si me explico). Si el número es 0 o 1, comprendo que el factorial es 1, pero no entiendo cómo la línea de código calcularFactorial(numero - 1) hace la multiplicación (calcula el factorial), si eso nunca se definió previamente.
Espero que me puedan ayudar.
Un cordial saludo.

3 respuestas
solución!
function calcularFactorial(numero) {
  if (numero === 0 || numero === 1) {
    return 1; // Caso base
  } else {
    return numero * calcularFactorial(numero - 1); // Llamada recursiva
  }
}
let numero = 5

Así se ve:
calcularFactorial(5)
= 5 * calcularFactorial(4)
= 5 * (4 * calcularFactorial(3))
= 5 * (4 * (3 * calcularFactorial(2)))
= 5 * (4 * (3 * (2 * calcularFactorial(1))))
= 5 * (4 * (3 * (2 * 1)))
= 5 * (4 * (3 * 2))
= 5 * (4 * 6)
= 5 * 24
= 120

Ves que en un punto llegará a 1? Pues ahí se activa el caso base y la función se parará

// 1. Crea una función que calcule el índice de masa corporal (IMC) de una persona a partir de su altura en metros y peso en kilogramos, que se recibirán como parámetros.

function calcularIMC(peso, altura) {
  let imc = peso / (altura * altura);
  return imc;
}
//2. Crea una función que calcule el valor del factorial de un número pasado como parámetro.

function calcularFactorial(numero) {
  if (numero < 0) return "No existe factorial para números negativos";
  let resultado = 1;
  for (let i = 1; i <= numero; i++) {
    resultado *= i;
  }
  return resultado;
}
//3. Crea una función que convierta un valor en dólares, pasado como parámetro, y devuelva el valor equivalente en reales(moneda brasileña,si deseas puedes hacerlo con el valor del dólar en tu país). Para esto, considera la cotización del dólar igual a R$4,80.

function converterDolarParaReal(valorEmDolar) {
  const cotacao = 4.80;
  const valorConvertido = valorEmDolar * cotacao;
  return `R$ ${valorConvertido.toFixed(2)}`;
}
//4. Crea una función que muestre en pantalla el área y el perímetro de una sala rectangular, utilizando la altura y la anchura que se proporcionarán como parámetros.

function calcularSalaRetangular(altura, largura) {
  const area = altura * largura;
  const perimetro = 2 * (altura + largura);
  console.log(`Área: ${area}`);
  console.log(`Perímetro: ${perimetro}`);
}
5. Crea una función que muestre en pantalla el área y el perímetro de una sala circular, utilizando su radio que se proporcionará como parámetro. Considera Pi = 3,14.

function calcularSalaCircular(raio) {
  const pi = 3.14;
  const area = pi * raio * raio;
  const perimetro = 2 * pi * raio;
  console.log(`Área: ${area.toFixed(2)}`);
  console.log(`Perímetro: ${perimetro.toFixed(2)}`);
}
//6. Crea una función que muestre en pantalla la tabla de multiplicar de un número dado como parámetro.

function mostrarTabuada(numero) {
  console.log(`Tabuada del ${numero}:`);
  for (let i = 1; i <= 10; i++) {
    console.log(`${numero} x ${i} = ${numero * i}`);
  }
}

Muchas gracias a ambos por tomarse el tiempo de responder, ahora me quedó claro.
No conocía la técnica de la recursividad, por eso no se me ocurría cómo resolver el problema. Había pensado en un bucle while, pero me complicaba escribir el código de esa forma. El código que escribió Fernanda también está bueno, pero menos se habría ocurrido, soy muy novato en esto xD.
En fin, gracias nuevamente.
¡Saludos!