为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

一只斗牛犬 2021-05-03 12:35:01
我正在使用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 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

也许一些简单的事情会有所帮助

  • 使用Setfor的访问值来防止永远不会结束的循环(记忆化),

  • 完全取数值,仅用于分割成单个数字时,取一个字符串,

  • 通过简单的乘法来总结,

  • 现在有一些退出功能:

    • 检查是否sum1,使用退出功能true

    • 检查是否sum已访问了如果是这样,与退出false

  • 通过使用再次调用该函数并使用来sum更新setvisited来返回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));


查看完整回答
反对 回复 2021-05-20
  • 1 回答
  • 0 关注
  • 187 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信