我想找到一个索引,使得ax ^ 2数组中的yes / no问题变得越来越少,为此我假设一个很酷的方法是通过切半半(或接近一半)来查找col位置并询问is col <= half?
取决于答案,我会选择其中一半并重复此操作,直至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,该数组[0,1][<2>,3,4]
中2的相对索引为0)
编辑:好吧也许我应该解释一下moveIndexBy
,它基本上是“当前工作阵列中的最低指数”
它适用于5x5数组,例如,如果我在x
中将recursiveFunc(x,5,0,0);
的值设为0到4,它将在较少可能的问题<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
答案 0 :(得分:0)
currentArrLen = (aproxHalf-moveIndexBy);
到
currentArrLen = aproxHalf;
我不知道是什么或为什么,但是修复了它:
0 3
1 3
2 3
3 4
4 4
5 3
6 3
7 3
8 4
9 4
编辑,因此,长度有时为0的无证错误也已修复,因此将if(currentArrLen<2)
更改为if(currentArrLen==1)