0

ax^2 配列で yes/no の質問の可能性を低くするインデックスを見つけたいと思います。このため、半分 (または半分近く) でカットし、にis col <= half?応じて尋ねることで col の位置を見つけることがクールなアプローチであると想定しました。答え、私は半分の1つを選び、これを まで繰り返します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ため、説明します。その値は、検索しようとしているインデックスのインデックスですが、小さい配列内のみです (たとえば、インデックス 2 を見つける 5x5 がある場合、新しい一度切り取った後の配列の長さは 3 であり、その配列内の 2 の相対インデックス[0,1][<2>,3,4]は 0 です)

編集:わかりました多分私は説明する必要がありますmoveIndexBy、それは基本的に「現在の作業配列の左端のインデックス」です

これは 5x5 の配列で動作します。たとえば、xで 0 から 4 の値を指定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 などは間違っています。おそらく52 つの手順で見つけることはできません。0 1 2 3 4 (5 6 7 8 9)その5 6 (7 8 9)場合でも、インデックスが の左か右かを確認する必要があります5 (6)。また、インデックスを見つけることさえできません6

4

1 に答える 1

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)

于 2013-10-01T23:59:43.613 に答える