我试图以递归方式计算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 :(得分: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/