Javascript递归问题

时间:2014-10-28 03:42:13

标签: javascript arrays recursion

我目前正在尝试编写一个脚本来确定您可以在数组中进行的“跳转”的最小数量,以便返回到初始起始编号。起始编号始终是数组中的最大编号。

例如,如果数组是[2, 3, 5, 6, 1],则起始编号为6,因为它是最大的。然后你可以向左或向右跳6个位置(你可以选择),你最终的位置是你的下一个数字。让我们说我们走对了,我们最终会在1,因为我们会循环回到数组的开头。然后,您可以向1方向离开,然后再次返回6。因此,最小跳跃次数 2

我编写了下面的函数来获取输入数组并确定最小跳转次数,但search()函数中的递归并不像我希望的那样工作。

每个搜索函数调用自身调用2次(一次为左,一次为右),但不断递增的count变量会“混淆”。一旦一行递归结束(当count>arr.length时),我希望它回到上一步并进行正确的递归。但是count变量不会恢复到上一步(它保持原样),因此整个函数就会停止。

TL DR:即使再次调用函数并覆盖变量,如何使javascript函数变量保持它们的状态呢?

function ArrayJumping(arr) { 
  //Find the largest number
  var startingPos=arr.indexOf(Math.max.apply(null, arr));
  //Find the multiple we are searching for
  var multiple=arr.length;
  return search(startingPos,multiple,arr,startingPos+1,0);
}
function search(pos,mult,arr,target,count) {
  if (count>arr.length) {
    return false;
  }
  var tpos=pos+1;
  if ((tpos==target && count!=0) || (tpos%target==0 && count!=0)) {
    return count;
  }
  for (var direction=-1;direction<=1;direction+=2) {
    nPos=getRealPos(pos+(direction*arr[pos]),arr);
    var result=search(nPos,mult,arr,target,count+1);
    if (result!=false) {
      return result;
    }
  }
}

function getRealPos(n,numArr) {
  if (n>=0) {
    while (n>numArr.length) {
      n-=numArr.length;
    }
  } else {
    while (n<0) {
      n+=numArr.length;
    }
  }
  return n;
}

0 个答案:

没有答案