通过递归地将数组切成两半来找到索引

时间:2013-10-01 19:37:28

标签: javascript arrays recursion

我想找到一个索引,使得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和其他人都错了,它不可能分两步找到50 1 2 3 4 (5 6 7 8 9)然后5 6 (7 8 9)您还需要查看索引是左侧还是右侧5 (6)。它甚至找不到索引6

1 个答案:

答案 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)