Enésimo número de Fibonacci - FreeCodeCamp #145 Daily Challenge
2 min
Enunciado
Dado un entero positivo n, devuelve el enésimo número de la sucesión de Fibonacci. La sucesión comienza así (posiciones 1-based):
1 → 0 2 → 1 3 → 1 4 → 2 5 → 3 6 → 5
Ejemplos de referencia:
nthFibonacci(4)→2nthFibonacci(10)→34nthFibonacci(15)→377nthFibonacci(40)→63245986nthFibonacci(75)→1304969544928657
Análisis
La entrada n se interpreta como 1-based: n = 1 corresponde a 0, n = 2 a 1. El objetivo es devolver el valor en la posición n.
Requisitos y consideraciones:
- Aceptar
ncomo entero positivo. - Mantener eficiencia para
nmoderados (p. ej. hasta decenas de miles si se usaBigInt). - Manejar limitaciones de precisión en JavaScript para números muy grandes.
Solución (Enfoque)
La solución más simple y eficiente en espacio es iterativa: mantener los dos últimos valores y avanzar hasta la posición n. La solución tiene tiempo O(n) y espacio O(1).
Implementación (JavaScript, 1-based)
function nthFibonacci(n) {
if (n <= 0)
throw new Error('n debe ser un entero positivo (1-based)')
if (n === 1)
return 0
if (n === 2)
return 1
let a = 0
let b = 1
for (let i = 3; i <= n; i++) {
const next = a + b
a = b
b = next
}
return b
}
// Ejemplo de uso
console.log(nthFibonacci(4)) // 2
console.log(nthFibonacci(10)) // 34Complejidad
- Complejidad temporal: O(n).
- Complejidad espacial: O(1).
Casos borde y notas
n <= 0: se lanza un error (entrada inválida).n = 1yn = 2: casos base retornan0y1respectivamente.- Precisión: usar
BigIntsi se espera que el resultado supereNumber.MAX_SAFE_INTEGER. - Alternativas más rápidas (tiempo O(log n)) incluyen la exponenciación de matrices o multiplicación por logaritmos; estas son útiles para
nextremadamente grandes.
Conclusión
La solución iterativa es clara, eficiente y suficiente para la mayoría de los usos prácticos. Para entornos que requieran precisión en números muy grandes, usar BigInt o algoritmos en tiempo logarítmico.