Codewars问题“快乐数字”我如何才能对我的代码进行一些更改以使其起作用?

时间:2019-05-02 14:25:01

标签: javascript

我正在处理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))
}

1 个答案:

答案 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));