试图找出这个编码问题:
编写一个算法来确定一个数字n是否“高兴”。
快乐数是由以下过程定义的一个数字:从任何正整数开始,用其数字的平方和替换该数字,然后重复该过程,直到该数字等于1为止(它将停留在其中),或者它在一个不包括1的循环中无休止地循环。这个过程以1结尾的数字是快乐数。
如果n是一个快乐的数字,则返回True,如果不是,则返回False。
我做了一些工作,但我不知道我做错了什么。会很感激你的指点。谢谢!
function isHappy(numba1){
let sum = 0;
numba = numba1.toString().split('')
let numbaArr = numba.map(y => parseInt(y))
for (var x = 0; x< numbaArr.length; x++){
sum += numbaArr[x] ** 2
}
if (sum > 1){
isHappy(sum)
}
else if (sum === 1){
return true
}
else if (sum <= 0){
return false
}
}发布于 2020-11-30 15:24:38
你的回答有两个问题,一个小的,一个大的。
若(sum > 1){ isHappy(sum) }
应该是
如果(sum > 1){返回isHappy(sum) }
15时,我们得到以下值15、26、40、16、37、58、89、145、42、20、4、16 ^
我们可以退出,因为我们见过16两次。15不高兴。但是对于44我们得到
44、32、13、10、1
我们在没有骑车的情况下撞上1,所以44是一个快乐的数字。
您的代码需要跟踪它到目前为止所看到的值。
下面是一种递归方法:
const digitsSquareSum = (n) =>
String (n) .split ('') .map (n => n * n) .reduce ((a, b) => a + b, 0)
const _isHappy = (n, seen) =>
n == 1
? true
: seen .has (n)
? false
: _isHappy (digitsSquareSum (n), seen .add (n))
const isHappy = (n) =>
_isHappy(n, new Set())
// display the happy numbers among the first 100 positive integers
console .log (Array .from ({length: 100}, (_, i) => i + 1) .filter (isHappy) .join(', '))
我们使用一个辅助函数来计算数字的平方和。这只会使主要功能变得更干净。主要功能,_isHappy是一个内部的、私有的函数,不向用户公开。它是递归的,并维护我们已经看到的值的Set。如果我们的号码是1,我们返回true。如果我们的数字在我们已经看到的一组值中,我们返回false。否则,我们将它添加到已经看到的集合中,通过调用我们的助手来计算下一个测试用例,并使用这些调用_isHappy。
我们的公共函数只是调用这个主函数,创建初始的空Set值,并将其与要测试的数字一起传递。
在我们的演示中,我们使用Array .from ({length: 100}, (_, i) => i + 1),这是从1到100创建整数数组的几种紧凑方法之一。实际上,我会将其抽象为一个range函数,它接受lo和hi值,并在它们之间创建一个整数数组,但这超出了这个答案的范围。
我们不必使用包含两个参数的内部递归函数和带有一个参数的公共函数的分解。我们可以使用这样的默认参数:
const isHappy = (n, seen = new Set()) =>
console .log({n, seen}) ||
n == 1
? true
: seen .has (n)
? false
: isHappy (digitsSquareSum (n), seen .add (n))但这也存在一些潜在的问题。例如,我们不能像以前那样叫它:
range(1, 100) .filter (isHappy)因为filter为其回调提供了其他参数。它不仅提供了值,还提供了索引和整个数组。然而,isHappy认为第二个参数是已见值的Set;当它通过索引时,事情就会失败。我们可以这样做:
range(1, 100) .filter ((n) => isHappy (n))但是当我们这样写的时候,我们总是要采取这样的谨慎态度。我已经养成了这样做的习惯,只有在内部功能中,我才能控制它的名称。偶尔也会咬我一口。
发布于 2020-11-27 21:44:43
保存一个可见数字和mod 10的列表,以获得最后一个数字,然后除以10,地板移动数字:
function sumSquares(num) {
let sum = 0;
while (num != 0) {
sum += (num % 10) ** 2;
num = Math.floor(num / 10);
}
return sum;
}
function isHappy(num) {
const seen = new Set();
while (num != 1 && !seen.has(num)) {
seen.add(num);
num = sumSquares(num);
}
return num == 1;
}https://stackoverflow.com/questions/65044103
复制相似问题