-5

我想知道,编写没有直接基本情况(例如:阶乘)的递归函数的最佳方法是什么,例如,要计算嵌套数组中的元素数量我有两种方法,下面的第一种是首选,因为它直接返回结果:

代码作为图像

第二个将计数保留在附加到函数的变量中,工作正常,但处理结果和重置变量很奇怪。

代码作为图像

任何指针表示赞赏。

4

2 回答 2

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,否则我们计算数组中的第一项 + 数组其余部分的总和。

于 2013-10-04T11:49:20.043 回答
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);) ,函数可能不会结束

于 2013-10-04T11:40:47.307 回答