【问题标题】:Counting zeros in a recursive manner以递归方式计算零
【发布时间】:2017-12-09 02:11:48
【问题描述】:

我正在尝试以递归方式计算 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。知道我的函数缺少什么吗?我该如何解决?

【问题讨论】:

  • 我真的很困惑,你没有提到任何关于阶乘的事情,但是在底部给出你的例子,我认为它们是相关的?如果我理解正确,基本上你想要一个接受非负整数的函数,计算阶乘,然后返回该值中尾随 0 的数量?
  • 您应该有两个函数:factorial(n) -&gt; factorial of ncountingZeros(n),它们调用 factorial 并返回返回值的尾随 0 的计数。 (countingZeros 不会递归,只有factorial 会)。
  • 正确。没错
  • 您的基本情况看起来也有问题。 0! = 1,没有尾随零。

标签: javascript recursion


【解决方案1】:

我觉得你工作太努力了。首先,在回复评论时,您实际上并不需要计算阶乘,因为您真正需要的只是计算 5 和 2 的因数。由于 2 的因数更多,您真正的答案是只是计算 5 的因数。但每个 5 的因数必须是 {1, 2, 3, ... n} 之一的因数,所以我们只需将平均分为 { 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

请注意,这两个函数都可以进行尾调用优化。

此外,虽然这确实涉及双重递归,但它并不是真的表现不佳。五分之四的内部递归在第一次调用时停止,其余的五分之四在第二次调用时停止,依此类推。

【讨论】:

    【解决方案2】:

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

    这是一个计算 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);
    

    请注意,阶乘乘积中每个 5 的倍数都会对尾随零的数量贡献 1。最重要的是,每 25 的倍数将为尾随零的数量增加 1。然后,每个 125 的倍数都会为尾随零的数量贡献另一个 1,依此类推。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多