首页 > 解决方案 > 如何通过将数字相乘来递归地减少数字?

问题描述

现在,我们有了这个递归函数:

function digitsMultipication(number) {
  let strNumber = number.toString();
  let firstNum = parseInt(strNumber[0]);

  if(strNumber.length==1){
    return firstNum
  }else{
    let x = ''
    for(i=1;i<strNumber.length;i++){
        x += strNumber[i]
    }
    x = parseInt(x)
    return firstNum * digitsMultipication(x);
  }
}

// TEST CASES
console.log(digitsMultipication(66)); // 36

我们如何编辑此函数,因为我们希望输出条件实际上是一位数。因为 36 仍然是 2 位,我们希望函数再次递归,直到输出为一位,即 8。

66 => 6 * 6 = 36,
36 => 3 * 6 = 18,
18 => 1 * 8 = 8(想要的最终输出)

标签: javascriptrecursion

解决方案


你的意思是这样的吗?

const
  get = num => {
      const sum = [...num + ''].reduce((sum, n) => n * sum);
      return sum < 10 ? sum : get(sum);
  },
  result = get(66);

console.log(result);

一种更有效的方法是避免字符串化,并且只使用数学:

const
  get = num => {
      let sum = 1;
      
      while (num) {
        sum *= num % 10;
        num = parseInt(num / 10);
      }
      
      return sum < 10 ? sum : get(sum);
  },
  result = get(66);

console.log(result);

甚至可以节省内存并避免递归:

const
  get = num => {
    let sum = 1;

    for (;;) {
      sum *= num % 10;
      num = parseInt(num / 10);

      if (num <= 0) {
        if (sum < 10) return sum;

        num = sum;
        sum = 1;
      }
    }
  },
  result = get(66);
  
console.log(result);


推荐阅读