首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >快乐数-递归

快乐数-递归
EN

Stack Overflow用户
提问于 2018-04-18 15:55:15
回答 4查看 1.2K关注 0票数 0

我对递归算法有一个问题,它解决了寻找快乐数字的问题。

以下是代码:

代码语言:javascript
运行
复制
function TestingFunction(number){
  sumNumberContainer = new Array(0);
  CheckIfNumberIsHappy(number);
}
function CheckIfNumberIsHappy(number){
  var sumOfTheNumbers = 0;
  for (var i = 0; i < number.length; i++) {
    sumOfTheNumbers += Math.pow(parseInt(number[i]), 2);
  }
  console.log(sumOfTheNumbers);
  if(sumOfTheNumbers == 1){
    return CheckIfNumberIsHappy(sumOfTheNumbers.toString());
    //return true;
  } else {
    sumNumberContainer.push(sumOfTheNumbers);
    if(sumNumberContainer.length > 1){
      for (var i = 0; i < sumNumberContainer.length - 1; i++) {
        for (var j = i + 1; j < sumNumberContainer.length; j++) {
          if(sumNumberContainer[i] == sumNumberContainer[j]){
            return CheckIfNumberIsHappy(sumOfTheNumbers.toString());
            //return false;
          }
        }
      }
    }
    CheckIfNumberIsHappy(sumOfTheNumbers.toString());
  }
}

算法工作得几乎很好。我用不同的数字调用函数来测试它,控制台显示了正确的结果。问题是,我几乎无法从函数中得到任何值。只有少数情况下我可以得到任何值:如果数字是从,0“和,1”生成的,例如1000。因此,我发现,当函数再次调用自己时,返回任何值都有问题。

现在我得到了两个结果:

  • 返回 返回CheckIfNumberIsHappy(sumOfTheNumbers.toString()); 给出一个无限环数。例如,当数字高兴时,函数一次又一次地在控制台编号中打印.
  • 返回 //返回true 或 //返回假 它给了我一个未定义的值

我被这个问题控制住了,我求你们帮忙。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-04-18 17:12:49

我得到了用户: Mark_M在评论中给我的解决方案。

我只需要用我以前的

代码语言:javascript
运行
复制
return true / return false

此外,我还必须在函数中返回递归语句,并返回CheckIfTheNumberIsHappy函数的值,这是在TestingFunction中调用的。

工作守则:

代码语言:javascript
运行
复制
function TestingFunction(number){
  sumNumberContainer = new Array(0);
  return CheckIfNumberIsHappy(number);
}
function CheckIfNumberIsHappy(number){
  var sumOfTheNumbers = 0;
  for (var i = 0; i < number.length; i++) {
    sumOfTheNumbers += Math.pow(parseInt(number[i]), 2);
  }
  console.log(sumOfTheNumbers);
  if(sumOfTheNumbers == 1){
    return true;
  } else {
    sumNumberContainer.push(sumOfTheNumbers);
    if(sumNumberContainer.length > 1){
      for (var i = 0; i < sumNumberContainer.length - 1; i++) {
        for (var j = i + 1; j < sumNumberContainer.length; j++) {
          if(sumNumberContainer[i] == sumNumberContainer[j]){
            return false;
          }
        }
      }
    }
    return CheckIfNumberIsHappy(sumOfTheNumbers.toString());
  }
}

(谢谢大家的大力支持:)

票数 0
EN

Stack Overflow用户

发布于 2018-04-18 16:16:36

我会退一步,用递归来重新检查你的问题。使用递归首先要考虑的是边缘情况--什么时候才能返回值而不进行递归。对于快乐的数字,这是很简单的情况,平方和=== 1和更困难的情况,有一个循环。因此,测试这些,并适当地返回。只有在那之后你才需要恢复。然后,它可以非常简单:

代码语言:javascript
运行
复制
function sumSq(num) {
  /* simple helper for sums of squares */
  return num.toString().split('').reduce((a, c) => c * c + a, 0)
}

function isHappy(n, seen = []) {
  /* seen array keeps track of previous values so we can detect cycle */
  let ss = sumSq(n)
  
  // two edge cases --  just return
  if (ss === 1) return true
  if (seen.includes(ss)) return false
  
  // not an edge case, save the value to seen, and recurse.
  seen.push(ss)
  return isHappy(ss, seen)
}

console.log(isHappy(23))
console.log(isHappy(22))
console.log(isHappy(7839))

票数 1
EN

Stack Overflow用户

发布于 2018-04-18 16:23:42

下面是一个简化的方法来解决这个问题

代码语言:javascript
运行
复制
const digits = x =>
  x < 10
    ? [ x ]
    : [ ...digits (x / 10 >> 0), x % 10 ]

const sumSquares = xs =>
  xs.reduce ((acc, x) => acc + x * x, 0)
  
const isHappy = (x, seen = new Set) =>
  x === 1
    ? true
    : seen.has (x)
      ? false
      : isHappy ( sumSquares (digits (x))
                , seen.add (x)
                )
    
for (let n = 1; n < 100; n = n + 1)
  if (isHappy (n))
    console.log ("happy", n)
    
// happy 1
// happy 7
// happy 10
// ...
// happy 97

上面的程序可以通过使用一种叫做回忆录的技术来改进。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49904075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档