Javascript 递归计算发生次数
为什么这个递归countoccurrence函数不起作用?这有一个子程序。有没有一种不用子程序的方法?在javascript中,似乎计数器变量必须有一个闭包(子例程函数),否则每次都会被重写Javascript 递归计算发生次数,javascript,recursion,Javascript,Recursion,为什么这个递归countoccurrence函数不起作用?这有一个子程序。有没有一种不用子程序的方法?在javascript中,似乎计数器变量必须有一个闭包(子例程函数),否则每次都会被重写 function numOccurencesRecursive(arr, val) { //base case. check it if it only has a length of 1 var count = 0; function doCount(arr, val) { if (
function numOccurencesRecursive(arr, val) {
//base case. check it if it only has a length of 1
var count = 0;
function doCount(arr, val) {
if (arr[0] === val) {
count++;
} else {
count += doCount(arr.slice(1), val)
}
return count;
}
return doCount(arr, val);
}
console.log(numOccurencesRecursive([2, 7, 4, 4, 1, 4], 4)); // should return 3 but returns 1
doCount
一旦找到匹配项,就会停止递归;因此,它将永远不会找到超过1个匹配项进行计数。因此,您要做的是,仅当您找到值时才增加计数,当您找到值时,递归函数结束,但反过来,这意味着您必须对数组中未找到的元素进行计数,如果您找到了某个元素,递增它,然后如果数组为空,则返回计数
代码:
我认为问题在于,您一直在反复思考,但使用了递归方法 迭代方法有一个全局变量,可在每个步骤更新:
函数numocurencesiteractive(arr,val){
var计数=0;
对于(var i=0;i而言,这肯定适用于所有递归嵌套:
function countItems(arr, item) {
var count = 0;
for (var i=0; i<arr.length; i++){
if (typeof(arr[i]) == typeof([])){
count += countItems(arr[i], item);
}
else{
if(typeof(arr[i]) != typeof([])){
if (arr[i] === item){
++count;
}
}
}
}
return count;
}
功能计数项目(arr,项目){
var计数=0;
对于(var i=0;我看不到这一点,你能再解释一点吗?删除外部count
变量,通过返回0
处理基本大小写;然后添加一个适当的重复大小写。对于重复大小写,“此字符是否匹配?”和“下一个字符中有多少匹配?”所需的所有计数信息都已准备就绪。That将简化逻辑——包括修复此错误——并使其更接近“理想”递归函数。哇,太酷了……您如何向布尔值添加递归调用,然后获得一个数字?能否显示前几个递归调用?@freezycold布尔值在引擎盖下被转换为数字0
或1
。您可以可能更喜欢(arr[0]==val?1:0)
很棒。我如何重构以返回偶数次出现的第一个元素?要编辑上面的代码以包含我的尝试,我将使用映射(或对象,如果所有项都由字符串唯一标识)计算每个项在数组中出现的次数。然后迭代到偶数。var m=new Map();arr.forEach(item=>m.set(item,(m.get(item)| | 0)+1);arr.find(item=>!(m.get(item)%2))
谢谢。这里有一句话要告诉你:我起初不太明白这个函数应该做什么,我已经修好了:)现在应该可以了。如果val==undefined
,这将产生无限递归。我建议在arr[0]==val
之前检查arr.length
。
function countItems(arr, item) {
var count = 0;
for (var i=0; i<arr.length; i++){
if (typeof(arr[i]) == typeof([])){
count += countItems(arr[i], item);
}
else{
if(typeof(arr[i]) != typeof([])){
if (arr[i] === item){
++count;
}
}
}
}
return count;
}