尝试使用codewars kate(Persistent Bugger),您必须取一个整数并将数字相乘,直到结果小于10(答案是达到10以下的次数)。
例如39 === 3,因为:
我的逻辑是使用while循环,因此,当multipliedNum> 10时,将整数拆分为单个数字,将数字相乘(每次将计数加1),然后如果结果为<10,则返回计数。 / p>
我的问题是,我不确定这段代码在哪里出问题,它没有返回任何内容:
function persistence(num) {
let multipliedNum = num;
let count = 0;
while (multipliedNum > 10) {
multipliedNum = (num + '').split('').reduce((previousValue, currentValue) =>
parseInt(previousValue, 10) * parseInt(currentValue, 10));
count += 1;
}
if (multipliedNum < 10) {
return count;
}
}
persistence(39);
关于我要去哪里的任何线索都很好! (这里有点JS初学者)
答案 0 :(得分:2)
您需要对while循环进行其他检查,因为您需要包括10
才能进行乘法。
然后,您需要相同的变量来进行简化和简化。您可以选择num
。如果出于相同的目的回收相同的变量,则不会造成损害。
然后对reduce进行简化的回调,parseInt
是不必要的,因为通过使用乘法操作数*
将隐式类型强制转换为数字。该运算符需要数字,并尝试将操作数转换为数字。
最后,只需返回计数-无需检查,就永远不会false
。
function persistence(num) {
var count = 0;
while (num > 9) {
num = num.toString().split('').reduce((a, b) => a * b);
count++;
}
return count;
}
console.log(persistence(39));
答案 1 :(得分:1)
代码的主要问题是由于以下条件,它陷入了无限循环:
while(multipliedNum > 10)
由于您一直坚持使用num
并将其分配给multipliedNum,因此multipliedNum始终大于10。
请尝试以下操作:
function persistence(num) {
let multipliedNum = num;
let count = 0;
while (multipliedNum > 10) {
multipliedNum = (multipliedNum + '').split('').reduce((previousValue, currentValue) =>
parseInt(previousValue, 10) * parseInt(currentValue, 10));
count += 1;
}
if (multipliedNum < 10) {
return count;
}
}
console.log(persistence(39));
答案 2 :(得分:1)
@daggett ,如果您更喜欢使用递归,则以下代码也可以解决您的问题,但我不建议您使用此代码。
我刚刚介绍过使用递归解决您的问题,这是在大型应用程序中用于简化任务的绝佳概念。
输入 39 和 336
的示例日志3 * 9 = 27
2 * 7 = 14
1 * 4 = 4
============
3 times
7 * 8 * 6 = 336
3 * 3 * 6 = 54
5 * 4 = 20
2 * 0 = 0
============
4 times
代码
function timeToGetNumberLessThan10(num) {
var s = '' + num
var chars = []
if(s.length == 1)
return 1
sum = 1
for(var i=0; i < s.length; i++) {
chars.push(s[i])
sum *= parseInt(s[i])
}
// Log message
console.log(chars.join(' * ') + ' = ' + sum)
if(sum < 10) {
return 1
} else {
// Recursive call
return 1 + timeToGetNumberLessThan10(sum)
}
}
// TEST 1
var count = timeToGetNumberLessThan10(39);
console.log('============')
console.log(count + ' times')
console.log('\n') // New line
// TEST 2
var count = timeToGetNumberLessThan10(786);
console.log('============')
console.log(count + ' times')
/*
3 * 9 = 27
2 * 7 = 14
1 * 4 = 4
============
3 times
7 * 8 * 6 = 336
3 * 3 * 6 = 54
5 * 4 = 20
2 * 0 = 0
============
4 times
*/
答案 3 :(得分:0)
while (multipliedNum > 10) {
multipliedNum = (num + '').split('').reduce((previousValue, currentValue) =>
parseInt(previousValue, 10) * parseInt(currentValue, 10));
count += 1;
}
您要将结果分配给multipliedNum
,但首先使用num
,这意味着它会不断地重复分配相同的num
。将num
更改为multipliedNum
。