【问题标题】:Not exiting recursive function不退出递归函数
【发布时间】:2014-03-10 01:34:55
【问题描述】:

我正在编写一个包含两个列表的函数,第二个列表与第一个列表相同,只是它被打乱并删除了一个元素。该函数应返回缺少的元素。我写了这个函数

var findRemoved = function(firstArr, secondArr, indx){
    var indx = indx || 0;
    for(var i = 0; i<secondArr.length; i++){
        if(firstArr[indx] === secondArr[i]){
            findRemoved(firstArr, secondArr, ++indx);
        }
    }
    console.log("found end ", firstArr[indx]);
    return firstArr[indx];

}

当我用

运行它时
var i = findRemoved([1,2,3,4,5,6,7], [5,4,2,6,1,3]);
console.log("i ",i);

我得到它控制台记录“找到结束”,7,这是正确的,但是递归并没有在那个时候中断并继续进行,直到它返回答案“2”知道我可能做错了什么?

【问题讨论】:

  • 那你想做什么?你想得到不在第二个数组中的值吗?
  • 看起来你只是想找到一个缺失的元素,因为你的回报是一个单一的价值。尝试在递归 if 中添加 else 语句,并将 return 语句放在 else 子句中。因此,如果找到该元素,则执行递归函数,但如果没有匹配,则该函数返回该值。
  • @Michael 因为第二个列表被打乱了,如果我这样做,它将返回数组中的第一个元素,因为第一个数组中的第一个元素不等于第一个元素第二个数组
  • 为什么需要递归?它可以简单得多。
  • 我只是想用递归来做,为了好玩,我想更好地理解递归。

标签: javascript recursion


【解决方案1】:

找到结果后,您的代码会继续运行,因此对于每个索引都会不断循环并返回该索引。您可以返回来自递归的索引,并在您发现第二个数组中出现第一个数组时停止循环。

注意:我没有尝试写一个好的实现,只是修复你的。

var findRemoved = function(firstArr, secondArr, indx){
  var indx = indx || 0;
  var result = null;
  for(var i = 0; result==null && i<secondArr.length; i++){
      if(firstArr[indx] === secondArr[i]){
          result = findRemoved(firstArr, secondArr, ++indx);
      }
  }
  result = result || firstArr[indx]
  console.log("found end ", result);
  return result;
}

var i = findRemoved([1,2,3,4,5,6,7], [5,4,2,6,1,3]);
console.log("i ",i);

这个问题:http://jsfiddle.net/b5Aus/

【讨论】:

  • 谢谢你,特别是谢谢你告诉我我的问题,而不仅仅是发布解决问题但没有给我解决方案的代码。
  • 为了澄清,我原始代码中的return语句并没有停止执行,因为已经启动了其他findRemoved()实例?
  • console.log 和返回在循环之外。因此,对于每次调用,它都会打印当前号码 firstArr[indx]。暂时忘记循环内的内容。如果我们调用索引为 0,1,2,3,... 的方法,它将打印 firstArr 中索引为 0,1,2...元素。
  • 您也可以将“result = ...”替换为“return”。
【解决方案2】:

你尝试过这样的事情吗?

var findRemoved = function(firstArr, secondArr){
    for(var i=0, l=firstArr.length; i<l; ++i)
        if(secondArr.indexOf(firstArr[i]) < 0)
            return firstArr[i];
}

【讨论】:

  • 这不起作用,因为第二个数组被打乱了
  • @JakeSchievink 仔细看,我编辑了我的答案,因为我意识到了这一点。
  • 还有,你为什么这么做,for(var i=0, l=firstArr.length; i&lt;l; ++i) 而不是for(var i=0; i&lt;firstArr.length; ++i)
  • @JakeSchievink 因为循环条件在每次迭代中运行,并且i&lt;li&lt;firstArr.length 快一点。只有当数组很大时才重要。
猜你喜欢
  • 2020-04-28
  • 1970-01-01
  • 1970-01-01
  • 2017-06-28
  • 2018-07-29
  • 1970-01-01
  • 2021-11-18
  • 2012-10-27
  • 1970-01-01
相关资源
最近更新 更多