Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

269
Views
Recibo RangeError: el tamaño máximo de la pila de llamadas excedió el error en Javascript

Estoy tratando de resolver un problema de leetcode a través de la recursividad, pero recibo un error que dice RangeError: Maximum call stack size exceeded tal vez esté haciendo algo mal.

Problema:

Escribe un algoritmo para determinar si un número n es feliz.

Un número feliz es un número definido por el siguiente proceso:

Comenzando con cualquier entero positivo, reemplaza el número por la suma de los cuadrados de sus dígitos.

Repita el proceso hasta que el número sea igual a 1 (donde permanecerá), o se repite sin cesar en un ciclo que no incluye 1. Aquellos números para los que este proceso termina en 1 son felices.

Devuelve verdadero si n es un número feliz y false si no lo es.

 Example 1: Input: n = 19 Output: true Explanation: 12 + 92 = 82 82 + 22 = 68 62 + 82 = 100 12 + 02 + 02 = 1 Example 2: Input: n = 2 Output: false

Mi código:

 var isHappy = function(n) { if(n.length<2) return false var fn=(n)=>{ let i=0; let sum=0; while(i<n.length){ sum=sum+Math.pow(n[n.length-1-i],2); i++; } while(sum!==1){ //console.log(sum) fn(sum); } if(sum === 1) return true } fn(n) };

PD: No necesito una solución para este problema. Quiero saber por qué mi código no funciona y qué estoy haciendo mal. Y, que cambios debo hacer para que funcione bien.

Enlace al problema anterior.

about 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Maximum call stack size exceeded

Este error ocurre cuando las funciones llaman a otras funciones demasiadas veces. En este caso, su función se llama a sí misma recursivamente sin fin, en caso de que el número sea "infeliz".

Considere agregar a su función algo que le permita saber si el proceso se repite sin cesar.

Considere usar argumentos/matrices para almacenar los números que ya han aparecido.

about 4 years ago · Santiago Trujillo Report

0

Como usted mismo escribió, "Repita el proceso hasta que el número sea igual a 1 (donde permanecerá), o se repite sin cesar en un ciclo" .

En su implementación, fn se llama a sí mismo infinitamente. En el proceso, la máquina virtual javascript crea un contexto de función en la memoria en cada iteración. Esto se puede hacer hasta un momento determinado, después de lo cual aparece el error Maximum call stack size exceeded .

¿Que estoy haciendo mal?

Devuelve verdadero cuando encuentra un número feliz, pero nunca devuelve falso de lo contrario. Agregue una condición para detectar números infelices (detectar un ciclo) y devuelva falso en ese caso.

Editar: aquí hay una implementación de ejemplo:

 var isHappy = function(n) { if(n.length<2) return false // placeholder to store already called values const calledValues= new Set() var fn=(n)=>{ let i=0; let sum=0; if (calledValues.has(n)) // cycle detected! return false; calledValues.add(n); while(i<n.length){ sum=sum+Math.pow(n[n.length-1-i],2); i++; } if (sum !== 1) return fn(sum.toString()); else // sum === 1, number is happy! return true } // make sure to pass a string to fn return fn(n.toString()); }; (new Array(20)).fill().map((_,i)=>10+i) .forEach(n=> console.log(n, "is happy?", isHappy(n)));

about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!