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