以递归方式计算零

时间:2017-12-09 02:11:48

标签: javascript recursion

我试图以递归方式计算TRAILING零。基本上我分割了最终的递归结果,然后创建了一个将计算所有零的var计数器。

function countingZeros(n) {
  if (n < 0) {
    // Termination condition to prevent infinite recursion
    return;
  }
  // Base case
  if (n === 0) {
    return 1;
  }

  // Recursive case
  let final = n * countingZeros(n -1);

  let counter = 0;

  String(final).split('').forEach(function(item){
    item === 0 ? counter++ : counter;
  });

  return counter;
}

countingZeros(12) // => suppose to output 2 since there are 2 trailing zeros from 479001600 but got 0

countingZeros(6) // => suppose to get 1 since 720 is the final result.

我期待得到2作为回报,因为计数器必须返回,但我得到0.任何想法我的功能缺少什么?我该如何解决?

2 个答案:

答案 0 :(得分:1)

我认为你工作太辛苦了。首先,在回应评论时,你实际上并不需要计算阶乘,因为你真正需要的是计算5和2的因子。而且因为还有更多因子2,你真正的答案是只计算5的因子。但是每个5的因子必须是{1,2,3,... n}之一的因子,所以我们只需要将5的最高幂加起来,均匀地分成{ 1,2,3,... n}。

我们可以通过一些简单的递归来做到这一点:

 const fiveFactors = (n, acc = 0) => (n % 5 == 0) 
       ? fiveFactors(n / 5, acc + 1) 
       : acc
 const factZeros = (n, acc = 0) => (n > 0) 
       ? factZeros(n - 1, acc + fiveFactors(n)) 
       : acc

 factZeros(1000) //=> 249

请注意,这两个函数都有资格进行尾调用优化。

此外,虽然这确实涉及双重递归,但它并不是真正的不良表现。五次中有四次,内部递归在第一次呼叫时停止,其余的,五次中有四次在第二次呼叫时停止,依此类推。

答案 1 :(得分:0)

您正在尝试使用字符串函数计算零的数量(我假设您忘记包含因子方法。正确的流程可能是 - 您首先将输入传递给阶乘方法并将输出从阶乘方法传递到countZeros方法)。无论如何在其他答案中已经说明,你实际上并不需要计算因子乘积来计算尾随零。

这是一个计算n!

中尾随零数的示例
        temp = 5;
        zeroes = 0;
        //counting the sum of multiples of 5,5^2,5^3....present in n!
        while(n>=temp){
            fives = n/temp;
            zeroes = zeroes + fives;
            temp = temp*5;  
        }
        printf("%d",zeroes);

请注意,factorial产品中每个5的倍数将对尾随零的数量贡献1。除此之外,25的每个倍数将对尾随零的数量贡献额外的1。然后,125的每个倍数将为尾随零的数量贡献另外1,依此类推。

这是了解这背后概念的一个很好的链接: https://brilliant.org/wiki/trailing-number-of-zeros/