while
ループを使用してバイナリ検索を実装しようとしています。私が探しているのは、配列内にあるときに動作するようです。しかし、私が探しているint
が存在しない場合、プログラムはループを塞ぐように見え、falseを返すことはありません。私はgdbを使用していますが、私はまだバグを把握していないようです。ご覧のとおり、if文などを追加して、これを理解しようとしています。cs50 pset3バイナリ検索でwhileループに詰まっています
bool search(int value, int values[], int n) {
sort(values, n);
int begin = 0;
int end = (n - 1);
if (n < 1) {
return false;
}
while (end > begin + 1) {
int center = ((begin + end)/2);
if (values[0] == value) {
return true;
}
if (begin == value) {
return true;
}
if (end == value) {
return true;
}
if (end == (begin + 1) || end == begin) {
if (end == value || begin == value) {
return true;
} else {
return false;
}
}
if ((values[center]) == value) {
return true;
} else
if ((values[center]) > value) {
end = center;
} else
if ((values[center]) < value) {
begin = center;
} else {
return false;
}
}
// TODO: implement a searching algorithm
return false;
}
'begin'と' end'は、なぜあなたは[値]でそれらをインデックスと比較されていますか? – Barmar
SOにはバイナリ検索アルゴリズムがたくさんあります(拘束されており、かなりの数がCS50にも関連しています)。それらのいくつかを見て、あなたのコードが非常に複雑すぎるだけでなく、間違っていることを確認する必要があります。例えば、必要以上に複雑なケースを扱う[Cのバイナリ検索のための最初と最後のオカレンス](http://stackoverflow.com/questions/35147784/)に便利なコードがありますが、コードも含まれていますあなたが必要です。あなたは[if文が真の条件を認識しない場合](http://stackoverflow.com/questions/38468878/)でも見ることができます。 –
@aknys:スコアの下にある灰色のチェックマークをクリックすると、回答の1つを受け入れることができます。 – chqrlie