我对递归算法有一个问题,它解决了寻找快乐数字的问题。
以下是代码:
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。因此,我发现,当函数再次调用自己时,返回任何值都有问题。
现在我得到了两个结果:
我被这个问题控制住了,我求你们帮忙。
发布于 2018-04-18 17:12:49
我得到了用户: Mark_M在评论中给我的解决方案。
我只需要用我以前的
return true / return false此外,我还必须在函数中返回递归语句,并返回CheckIfTheNumberIsHappy函数的值,这是在TestingFunction中调用的。
工作守则:
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());
}
}(谢谢大家的大力支持:)
发布于 2018-04-18 16:16:36
我会退一步,用递归来重新检查你的问题。使用递归首先要考虑的是边缘情况--什么时候才能返回值而不进行递归。对于快乐的数字,这是很简单的情况,平方和=== 1和更困难的情况,有一个循环。因此,测试这些,并适当地返回。只有在那之后你才需要恢复。然后,它可以非常简单:
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))
发布于 2018-04-18 16:23:42
下面是一个简化的方法来解决这个问题
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
上面的程序可以通过使用一种叫做回忆录的技术来改进。
https://stackoverflow.com/questions/49904075
复制相似问题