快乐的数字 - 递归

时间:2018-04-18 15:55:16

标签: javascript recursion

我遇到了递归算法的问题,它解决了找到满意数字的问题。

以下是代码:

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());
  }
}

算法运行ALMOST很好。我通过调用具有不同数字的函数来测试它,并且控制台显示正确的结果。问题是我几乎无法从函数中获得任何值。只有少数情况下我可以获得任何值:如果数字是构建的,0“,和1”,例如1000。 因此,我发现,当函数再次调用自身时,我返回任何值都有问题。

现在我得到了2个结果:

  • 返回

    return CheckIfNumberIsHappy(sumOfTheNumbers.toString());
    

    给出无限循环数。例如,当数字很满意时,该功能一次又一次地在控制台号码中打印......

  • 返回

    //return true
    

    //return false
    

    给了我一个未定义的值

我对这个问题有点了解,我求你们帮忙。

4 个答案:

答案 0 :(得分:0)

我会后退一步,并考虑递归重新检查你的问题。你应该考虑递归的第一件事就是你的边缘情况 - 你什么时候才能返回一个没有递归的值。对于快乐的数字,这是一个简单的情况,其中平方和=== 1和更复杂的情况,其中有一个周期。所以测试那些并适当地返回。只有在那之后才需要递归。它可以很简单:

&#13;
&#13;
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))
&#13;
&#13;
&#13;

答案 1 :(得分:0)

这是解决问题的简化方法

&#13;
&#13;
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
&#13;
&#13;
&#13;

通过使用名为memoization

的技术,可以改进上述程序

答案 2 :(得分:0)

您的代码几乎是正确的。你只是忘了返回递归调用的结果:

function TestingFunction(number){
    sumNumberContainer = new Array(0);
    if (CheckIfNumberIsHappy(number))
        console.log(number);
}
function CheckIfNumberIsHappy(number){
    var sumOfTheNumbers = 0;
    for (var i = 0; i < number.length; i++) {
        sumOfTheNumbers += Math.pow(parseInt(number[i]), 2);
    }
    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());
    }
}

for (let i=0; i<100; ++i)
    TestingFunction(i.toString()); // 1 7 10 13 ... 91 94 97

答案 3 :(得分:0)

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

我只需要使用我以前的

return true / return false

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

工作代码:

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());
  }
}

感谢您的大力支持:)