我想找到一个索引,使 ax^2 数组中的是/否问题的可能性降低,为此我假设一个很酷的方法是通过在一半(或一半附近)切割并is col <= half?
根据询问来找到 col 位置回答,我将选择其中一个并重复此操作直到length == 1
,然后进行相同操作,但is row <= half?
要找到该行。
这是我的函数(第一次尝试递归函数):
function recursiveFunc(indexPos, currentArrLen, moveIndexBy, countLoops){
var aproxHalf, relativeIndexPos;
relativeIndexPos = (indexPos-moveIndexBy);
aproxHalf = Math.floor(currentArrLen/2);
if(currentArrLen<2){
return (moveIndexBy+" "+countLoops);
}else{
countLoops++;
if(relativeIndexPos>=aproxHalf){
moveIndexBy += aproxHalf;
currentArrLen -= aproxHalf;
}else{
currentArrLen = (aproxHalf-moveIndexBy);
}
return recursiveFunc(indexPos, currentArrLen, moveIndexBy, countLoops);
}
}
唯一看起来无法自我解释的 var 可能是relativeIndexPos
,所以我将解释它,它的值是我们试图找到的索引的索引,但仅在较小的数组中(例如,如果我们有 5x5 查找索引 2,则新的切割一次后的数组长度为3,该数组中2的相对索引[0,1][<2>,3,4]
为0)
编辑:好吧,也许我应该解释一下moveIndexBy
,它基本上是“当前工作数组中最左边的索引”
它适用于 5x5 数组,例如,如果我给出x
0 到 4 in 的值recursiveFunc(x,5,0,0);
,它会在不太可能的问题中正确找到索引<index/questions> 0:2, 1:2, 2:2, 3:3, 4:3
。
但是对于更大的数组,这会失败,例如,10x10 将给出:
0 3
1 3
2 3
3 4
4 4
5 2
5 2
7 3
8 4
9 4
5
5和其他都是错的,分两步不可能找到:0 1 2 3 4 (5 6 7 8 9)
那5 6 (7 8 9)
你还需要看索引是左还是右5 (6)
。它甚至找不到索引6