Javascript一个没有明确基本情况的递归函数?

时间:2013-10-04 10:50:29

标签: javascript recursion

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

code as image

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

code as image

任何指针都表示赞赏。

2 个答案:

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