我想知道,编写没有直接基本情况(例如:阶乘)的递归函数的最佳方法是什么,例如,要计算嵌套数组中的元素数量我有两种方法,下面的第一种是首选,因为它直接返回结果:
第二个将计数保留在附加到函数的变量中,工作正常,但处理结果和重置变量很奇怪。
任何指针表示赞赏。
我想知道,编写没有直接基本情况(例如:阶乘)的递归函数的最佳方法是什么,例如,要计算嵌套数组中的元素数量我有两种方法,下面的第一种是首选,因为它直接返回结果:
第二个将计数保留在附加到函数的变量中,工作正常,但处理结果和重置变量很奇怪。
任何指针表示赞赏。
正确的写法很简单:
function countElements (obj) {
if (obj instanceof Array) {
var count = 0;
for (var i in obj)
count += countElements(obj[i]);
return count;
}
return 1
}
您正在寻找的终止条件是if not instanceof Array
. 在我上面的代码中,这只是从if instanceof Array
块中掉出来的。
您不需要像count
递归函数那样保留临时变量。您仍在迭代地思考(嗯,for 循环是迭代的,所以您需要一个count
变量)。
递归函数通过接受参数并返回结果来完成所有工作。没有任务是必要的。事实上,上面的代码可以完全递归地编写而不使用 for 循环,因此不需要使用count
变量:
function countElements (obj) {
if (obj instanceof Array) {
if (obj.length) {
return countElements(obj.shift()) + countElements(obj);
}
return 0;
}
return 1;
}
有 3 条规则:如果 object 不是数组,我们返回 1,如果 object 是一个空数组,我们返回 0,否则我们计算数组中的第一项 + 数组其余部分的总和。
您可以简单地返回您感兴趣的值:
function countElements(arr) {
var count = 0;
for (var i=0; i<arr.length; i++) {
if (arr[i] instanceof Array) {
count += countElements(arr[i]); // recursion here
} else {
count++; // normal element counts as 1
}
}
return count;
}
演示:http: //jsbin.com/ejEmOwEQ/1/edit
警告:如果数组包含自引用(var arr = []; arr.push(arr); countElements(arr);
) ,函数可能不会结束