0

このコードの問題点を見つけて修正しようとしています。再帰によって実装された二分探索です。スタック オーバーフローとクラッシュが返される理由がわかりません。

bool find( const int x, const int* pBegin, const int* pEnd)
{
    int medel = (*pBegin +(( *pEnd-1) - *pBegin)/2) ;

    if(x == medel)
        return true ;

    else if( x > medel) 
    {
        int begin = (medel +1);

        return find (x, &begin, pEnd);
    }
    else if( x< medel)
    {
        int last = (medel-1);

        return find(x,pBegin, &last);
    }

}


void main()
{
    int arr[10];
    for (int i=0;i<10;++i)
        arr[i] = i;
    bool hittat = find(7, &arr[0], &arr[9]);
    cout << "hittat = " << hittat << endl;

    system("pause");
}

コードをデバッグすると、関数 "find" が呼び出されると、この picのように奇妙な引数を取ることがわかります。

これらの巨大な数ではなく、0 と 9 を取る必要があります:/ 私のポインターに何か問題がありますか?

4

4 に答える 4

1

一部の場所ではへのポインターとして使用していますが、medel他の場所では として使用しています。middleintint

次のように宣言してみてください。

const int* middle = pBegin + (pEnd - pBegin + 1) / 2;

次に、そこに保存されているものにアクセスしたい場合は、 を使用します*medel

また、2 つ目の終了条件 (見つからない場合) が必要になります。何かのようなもの:

if (((middle == pEnd) && (x > *middle)) ||
         ((middle == pBegin) && (x < *middle))) {
  // Terminating condition                                                                                                                                                                              
  return false;
}
于 2013-01-26T19:28:38.507 に答える
1

ポインターの平均を計算し、それらの間の要素の廊下のを確認する必要があります。代わりに、それらが指すの平均を計算しますが、これは大きく異なります。

于 2013-01-26T19:34:01.063 に答える
0

写真に示されている問題は、前の質問で見たように、元のコードから取られたように見えます。pEnd が配列の末尾を超えているため、逆参照は許可されていません (奇妙な値が生成されます)。

投稿されたコードでは発生しないはずです。

現在のコードは、有効な整数へのポインターのみを使用しています。しかし、それらのほとんどは配列を指していないため、配列内での検索ではありません。プログラムは単に整数を使って計算を行います。配列の最初と最後の要素の値のみが使用されます。

整数値をそのストレージへのポインターとして渡すため、プログラムは混乱します。配列へのポインタから始めて、計算値を保存した自動変数 (beginおよび)へのポインタを混ぜます。end(最初と最後以外の配列要素へのポインターを使用することはありません。

于 2013-01-26T19:45:50.527 に答える
0

int と int のポインターを medel と混合しています。ポインターに設定し、彼のデータにアクセスするだけです*medel

于 2013-01-26T19:35:42.157 に答える