我想知道,编写递归函数的最佳方法是什么,没有直接的基本情况(例如:factorial),例如,计算嵌套数组中的元素数量我有两种方法,第一种下面的一个是首选,因为它直接返回结果:
第二个将计数保存在附加到函数的变量中,工作正常,但处理结果&重置变量是奇怪的。
任何指针都表示赞赏。
答案 0 :(得分: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);
)
答案 1 :(得分:0)
写这个的正确方法很简单:
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否则我们计算数组中的第一项+数组其余部分的总和。