Javascript 在JS中使用递归函数计算数组元素

Javascript 在JS中使用递归函数计算数组元素,javascript,arrays,recursion,Javascript,Arrays,Recursion,我正在翻阅《grokking算法》一书,并试图围绕递归展开思考。书中的一个挑战是“编写一个递归函数来计算列表中的项数”。我提出了以下代码,它可以工作: 函数递归arraycount(arr,count){ 如果(arr.length==0){ 返回0; }否则{ arr.pop(); 返回计数+递归数组计数(arr,count); } } 让myArray=[1,10,23,11,4,48,88]; log(recursiveArrayCount(myArray,1))您根本不需要第二个参数:

我正在翻阅《grokking算法》一书,并试图围绕递归展开思考。书中的一个挑战是“编写一个递归函数来计算列表中的项数”。我提出了以下代码,它可以工作:

函数递归arraycount(arr,count){
如果(arr.length==0){
返回0;
}否则{
arr.pop();
返回计数+递归数组计数(arr,count);
}
}
让myArray=[1,10,23,11,4,48,88];

log(recursiveArrayCount(myArray,1))您根本不需要第二个参数:

函数递归ArrayCount(arr){
如果(arr.length==0){
返回0;
}
返回1+recursiveArrayCount(arr.slice(1));
}

通过消除递归调用返回后所需的任何变量引用,进行适当的尾部调用

函数递归ArrayCount(arr){
返回递归计数(arr,0);
函数_递归计数(arr,count){
返回arr.length==0?count:_recursiveCount(arr.slice(1),count+1);
}
}
让myArray=[1,10,23,11,4,48,88];

log(recursiveArrayCount(myArray))
我还喜欢使用
切片
而不是修改原始数组。另一种不需要复制或修改数组的方法是更改
if
if(arr.length谢谢!这正是我想要的-简单而雄辩。@T.J.Crowder但使用
arr.length
有点欺骗…如果我们可以访问
length
属性,就没有理由进行计数…@谢谢,那是我的错误。如果(arr='')考虑到函数的角色,它也可以工作,而且更有意义。@Yousaf-对,但这是一个巨大的警告,这是我的观点:“-”在javascript中有更好的方法吗?”:是的。这不是您应该使用递归的原因。对于长数组,您将得到堆栈溢出错误。此外,您的函数正在使用
pop
对数组进行变异。这对函数的调用方不好,调用后,调用方会发现其数组已被破坏。看到尝试计数的代码也很奇怪不使用
length
属性的数组中的条目(当然这是最简单的解决方案),但仍然使用该属性。我同意trincot在其评论中所说的。在函数中使用length属性而不使用length属性来计算数组的长度是很奇怪的。我同意你在实践中永远不会这样做,这只是理解递归的一种练习。我也同意使用arr.lengt考虑到函数的角色,h是一个糟糕的选择。将其更改为if(arr=='')更有效,更有意义。