首页 > 解决方案 > 将数字总和递归减少到一位数字

问题描述

我正在尝试解决代码信号上的挑战(数字度数),其中的任务是找到我们需要用它的数字之和替换这个数字的次数,直到我们得到一个数字。即传入的数字是5,它已经是一个数字,所以结果应该是0。如果数字是100,它的数字之和是1,这是一个数字,所以结果应该是1,依此类推......

我正在做一个这样的递归解决方案:

let count = 0;
function digitDegree(n) {
  if (n < 10) {
    console.log(count);
    return count;
  };
  const arr = n.toString().split('').map(Number);
  const sumOfDigits = arr.reduce((acc, curr) => acc + curr);
  count++;
  digitDegree(sumOfDigits);
}

在第二个循环中,即使控制台日志显示正确的值,我也会得到 null 作为输出。它哪里出错了?

我看到这个问题之前已经提出了,但答案是相当数学的。这种方法可以吗,还是会被认为是不好的做法?

标签: javascript

解决方案


您需要一个return语句来获取递归的结果。

return digitDegree(sumOfDigits);

更短的方法是提前删除显式转换并删除临时数组。

然后为 count 取另一个参数并省略一个全局变量。

function digitDegree(n, count = 0) {
    if (n < 10) return count;
  
    return digitDegree(
        n   .toString()
            .split('')
            .reduce((acc, curr) => acc + +curr, 0),
        count + 1
    );
}

console.log(digitDegree(9999));


推荐阅读