【问题标题】:Javascript a recursive function with no clear base case?Javascript 是一个没有明确基本情况的递归函数?
【发布时间】:2013-10-11 08:16:13
【问题描述】:

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

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

任何指针表示赞赏。

【问题讨论】:

  • 发布代码截图没有帮助。只需将代码粘贴到您的问题中即可。
  • 你为什么不能把它作为参数传递?另外,我不确定了解数组中元素计数的基数的作用。
  • 说真的,无法复制粘贴您的代码会使回答这个问题变得更加困难。
  • 图片不见了。这就是为什么您应该粘贴代码而不是发布图片的原因。

标签: javascript recursion


【解决方案1】:

您可以简单地返回您感兴趣的值:

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);)

【讨论】:

    【解决方案2】:

    正确的写法很简单:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-01
      • 2013-11-08
      • 1970-01-01
      • 2015-03-26
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多