我正在处理Codewars问题'Happy Numbers',这是链接https://www.codewars.com/kata/happy-numbers-5/train/javascript。这是问题,当我在n> 98时运行代码时,已达到最大调用堆栈大小。如何对我的代码进行一些更改以解决此问题?
function happyNumbers(x){
var res = [];
for (let i = 1; i <= x; i++){
var str = [];
if (helper(str,i)){res.push(i)}
}
return res
}
function helper(str,n){
var num = 0;
if (n === 1){return true}
if (str.indexOf(n) > -1){return false}
str.push(n);
if (n.toString().length === 1){num = Math.pow(n,2).toString()}
if (n.toString().length >= 2){
num = n.toString().split('')
.reduce((a,b) => Math.pow(a,2)+ Math.pow(b,2)).toString();
}
return helper(str,Number(num))
}
答案 0 :(得分:2)
也许更简单的饮食会有所帮助
Set
作为访问值,以防止循环循环永远不会结束(Memoization),sum
是否为1
,用true
退出函数,sum
,如果已经访问过,请返回false
,sum
调用函数并使用visited
更新集合sum
来返回。
function happyNumbers(x, visited = new Set) {
var sum = 0, value;
for (value of String(x)) sum += value * value;
if (sum === 1) return true;
if (visited.has(sum)) return false;
return happyNumbers(sum, visited.add(sum));
}
console.log(happyNumbers(123));