私は再帰バイナリ検索関数を作成する必要のある学校の割り当てを持っています。私は関数の署名を変更することはできません。 私のポインターの経験は最高ではないし、私の問題はそこにあると思う。 私はStackoveflowを取得するが、私は本当に道bool関数を使用したC++での再帰バイナリ検索
bool contains(const int* pBegin, const int* pEnd, int x)
{
int length = pEnd - pBegin;//gives me the length of the array
const int* pMid = pBegin + (length/2);
if(length == 1)
{
if(*pMid != x)
return false;
return true;
}
else if(x < *pMid)
return contains(pBegin, pMid-1, x);
else
return contains(pMid, pEnd, x);
}
void main(){
setlocale(LC_ALL, "swedish");
int arr[10];
for(int i = 0; i < 10; ++i)
arr[i] = i;
bool find = contains(&arr[0], &arr[10], 3);//arr[10] points to the index after the array!
cout <<"found = "<< find << endl;
system("pause");
}
理解しない誰かが私が間違ってやっているものを私に説明していただけますし、どのように私はより良い方法でそれを行うだろうか?
デバッガを使用してコードをステップ実行する方法を学ぶ必要があるようです。良いデバッガを使用すると、プログラムを1行ずつ実行し、どこからずれているかを確認することができます。これはプログラミングをする場合に不可欠なツールです。さらに読む:** [小さなプログラムをデバッグする方法](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver
*私はStackoveflow *おそらく無限の再帰まで。あなたは 'contains'を呼び出しています。これは' contains'を呼びます。これは 'contains'などを呼び出し、スタックがオーバーフローするまで決してこの呼び出しチェーンから抜け出すことはありません。 – PaulMcKenzie
C++を使っているなら、 'int arr [10]'を使う習慣から抜け出し、 'std :: vector arr'を使う必要があります。 –
tadman