2016-08-03 3 views
0
#include <iostream> 

using namespace std; 

int bsearch(int x, int lo, int hi, int a[]) 
{ 
    if(lo <= hi) { 
     int mid = lo + (hi - lo)/2; 
     if(x == a[mid]) { 
      cout<<mid<<endl; 
      return mid; 
     } else if(x < a[mid]) { 
      hi = mid - 1; 
      bsearch(x, lo, hi, a); 
     } else { 
      lo = mid + 1; 
      bsearch(x, lo, hi, a); 
     } 
    } 

    return -1; 
} 

main() 
{ 
    int a[5] = {12, 13, 15, 18, 20}; 
    cout << bsearch(20, 0, 4, a); 
} 

上記はC++でのバイナリ検索の実装です。ソートされた配列を入力として取り込むバイナリ検索を実行する関数を作成しました。 main関数の中で、ソートされた整数の配列を関数の引数として渡しました。プログラムは、配列の極端に位置していない要素を検索するとうまく動作するようですが、極端な要素に対しては間違った出力を与えます。エラーを見つけるために、関数本体に "mid"の値を出力するための "cout"ステートメントを含めました。驚くべきことに、配列の極端な要素の場合でも、midの値は正しく計算されますが、プログラムの出力は極端な要素に対してはまだ間違っています。誰がそれが間違っていることを指摘できますか?ソートされた配列の極限要素のバイナリ検索の出力が正しくありません

+2

あなたは、いくつかの*もっと*デバッグを行う必要があります。すべてのステップを実行して、どの計算が間違っているかを調べます。 –

+4

これらのすべての再帰呼び出しを 'bsearch'に行い、その結果を破棄します。トップレベルの呼び出し( 'main'からの呼び出し)は、' return -1; 'に落ちます。 –

+0

再帰呼び出しで 'return'を置くべきです:' return bsearch(x、lo、hi、a); ' –

答えて

2

bsearch関数への再帰呼び出しでreturn文が行内にありません。

これは動作するようです:

int bsearch(int x, int lo, int hi, int a[]) 
{ 
    if(lo <= hi) 
    { 
     int mid = lo + (hi - lo)/2; 
     if(x == a[mid]) 
     { 
      return mid; 
     } 
     else if(x < a[mid]) 
     { 
      hi = mid - 1; 
      return bsearch(x, lo, hi, a); 
     } 
     else 
     { 
      lo = mid + 1; 
      return bsearch(x, lo, hi, a); 
     } 
    } 
    return -1; 
} 
+0

ありがとう。問題は私が再帰呼び出しを理解していたことによるものです。ちょうど明確にするために、再帰的に呼ばれる関数のreturn文は、それを呼び出したプログラムに制御を移しますか? (そしてここで私はそれがコントロールを 'main'関数に返すと仮定した。) –

関連する問題