我目前正在尝试编写一个脚本来确定您可以在数组中进行的“跳转”的最小数量,以便返回到初始起始编号。起始编号始终是数组中的最大编号。
例如,如果数组是[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;
}