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



我正在阅读grokking算法的书,并试图了解递归。书中的挑战之一是";编写一个递归函数来计算列表中的项数&";。我想出了以下代码,它有效:

function recursiveArrayCount(arr, count) {
if (arr.length == 0) {
return 0;
} else {
arr.pop();
return count + recursiveArrayCount(arr, count);
}
}
let myArray = [1, 10, 23, 11, 4, 48, 88];
console.log(recursiveArrayCount(myArray, 1));

我的问题是,在javascript中有更好的方法吗?特别是,我不喜欢用首字母"1"作为计数值的种子,但我想不出其他方法。

您根本不需要第二个参数:

function recursiveArrayCount(arr) {
if (arr.length == 0) {
return 0;
}
return 1 + recursiveArrayCount(arr.slice(1));
}

通过消除对递归调用返回后所需变量的任何引用来进行正确的尾部调用。

function recursiveArrayCount(arr) {
return _recursiveCount(arr, 0);
function _recursiveCount(arr, count) {
return arr.length == 0 ? count : _recursiveCount(arr.slice(1), count + 1);
}
}
let myArray = [1, 10, 23, 11, 4, 48, 88];
console.log(recursiveArrayCount(myArray));

这使得它更有可能通过重用堆栈空间进行优化。

此外,我为递归使用了嵌套函数,这确保了count被正确初始化。


你也可以对内部功能有一点兴趣,比如:

function recursiveArrayCount(arr) {
return (function _recursiveCount(arr, count) {
return arr.length == 0 ? count : _recursiveCount(arr.slice(1), count + 1);
})(arr, 0);
}
let myArray = [1, 10, 23, 11, 4, 48, 88];
console.log(recursiveArrayCount(myArray));

它是一个递归调用的IIFE。

最新更新