乘法持久性Codewars挑战

时间:2019-02-18 20:58:26

标签: javascript

我一直在研究Codewars的kata,挑战是编写一个持久性函数,该函数接受一个正数num并返回其乘法持久性,这是您必须将num中的数字相乘的次数直到达到个位数。

示例:

persistence(39) === 3 // because 3*9 = 27, 2*7 = 14, 1*4=4
                       // and 4 has only one digit

persistence(999) === 4 // because 9*9*9 = 729, 7*2*9 = 126,
                        // 1*2*6 = 12, and finally 1*2 = 2

persistence(4) === 0 // because 4 is already a one-digit number

试图弄清楚这一点时,我在网上遇到了一个解决方案(如下所示),并且在试图理解其逻辑之后,我不明白为什么代码不起作用

var count = 0;

function persistence(num) {
  if (num.toString().length === 1) {
    return count;
  }
  count++;
  var mult = 1;
  var splitStr = num.toString().split("");
  for (var i = 0; i <= splitStr; i++) {
    mult *= parseFloat(splitStr[i])
  }
  return persistence(parseFloat(mult));
}

任何一位数字的输出将为0,这是正确的,但是对于任何多位数的数字,持久性始终记录为1,我似乎无法弄清楚为什么,任何帮助将不胜感激。 / p>

2 个答案:

答案 0 :(得分:2)

发布的代码有很多问题。

for (var i = 0; i <= splitStr; i++) {

但是splitStr是一个数组,而不是数字; i <= splitStr没有任何意义。应该检查splitStr.length而不是splitStr

另一个问题是应该使用i <而不是i <=,否则最后的splitStr[i]将是undefined

另一个问题是count变量是全局变量,因此多次调用persistence会导致结果不准确。完全不需要count变量。要解决它:

function persistence(num) {
  if (num.toString().length === 1) {
    return 0;
  }
  var mult = 1;
  var splitStr = num.toString().split("");
  for (var i = 0; i < splitStr.length; i++) {
    mult *= parseFloat(splitStr[i])
  }
  return 1 + persistence(parseFloat(mult));
}

console.log(
  persistence(999),
  persistence(39),
  persistence(4)
);

或者,可以完全避免for循环,而使用更合适的数组方法:

function persistence(num) {
  const str = num.toString();
  if (str.length === 1) {
    return 0;
  }
  const nextNum = str.split('').reduce((a, b) => a * b, 1);
  return 1 + persistence(nextNum);
}

console.log(
  persistence(999),
  persistence(39),
  persistence(4)
);

答案 1 :(得分:0)

或者我们可以使用带有减少数组方法的while循环

const persistence=(num)=>{

  let splitNumArr=num.toString().split('')
  let newList
  let count=0
  while(splitNumArr.length>1){

     newList=splitNumArr.reduce((acc,curr)=>{
        return acc*=curr
     })
      splitNumArr=newList.toString().split('')
      count++

  }

return count
}



console.log(persistence(39))===3
console.log(persistence(999))===4
console.log(persistence(9))===0