没有退出递归函数

时间:2014-03-09 17:16:49

标签: javascript recursion

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

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”任何想法我可能做错了什么?

2 个答案:

答案 0 :(得分:3)

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

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

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/

答案 1 :(得分: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];
}