0

ここに、特定のキーを見つけるために 100 個の整数の配列を検索するという非常に単純な仕事を行うプログラムがあります。このプログラムのlinearSearch関数は再帰的であると想定されているため、関数自体から呼び出す必要があります。プログラムは正常にコンパイルされますが、何らかの理由で0、入力した検索キーに関係なく、配列内の最初の要素のみが返されます。何が表示されないのですか? ありがとう。

#include <iostream>
using namespace std;

int linearSearch(const int[], int, int);

int main()
{
    const int arraySize = 100; //size of array  
    int a[arraySize]; //create array a
    int searchKey; //value to locate in array a

    for(int i = 0; i < arraySize; i++)
            a[i] = 2 * i; //create data

    cout << "Enter integer search key: ";
    cin >> searchKey;

    //attempt to locate search key in array a
    int element = linearSearch(a, searchKey, arraySize);

    //display results
    if(element != -1)
               cout << "Found value in element: " << element << endl;
    else
               cout << "Value not found" << endl;

    system("pause");   
}

//linearSearch Function ****Returns 0 as index all the time *************
int linearSearch(const int array[], int key, int sizeOfArray)
{
    static int index = 0;

    //if Out of range, return -1 (Value not found)
    if(index >= sizeOfArray){return -1;}

    //if array value = key, array index is returned
    if(array[index] == key){return index;}

    //if array value is not equal to key, add to index and call func again                
    if(array[index] != key)
    {
                    index++;
                    linearSearch(array, key, sizeOfArray);                
    }   
}

indexと宣言することで正しいアプローチを取っていますよstaticね?

〜どうもありがとうございました。迅速で大変助かりました。=)

4

4 に答える 4

4

あなたの間違いはそれです

if(array[index] != key)
{
    index++;
    linearSearch(array, key, sizeOfArray);                
}

する必要があります

if(array[index] != key)
{
    index++;
    return linearSearch(array, key, sizeOfArray);                
}

キーが等しくない場合、値は返されません。

さらに、すでに述べたように、静的インデックスは悪いです。

于 2013-04-01T14:36:29.540 に答える
3

indexと宣言することで正しいアプローチを取っていますよstaticね?

いいえ。むしろ、index再帰関数の引数にする必要があります。

このstatic状態のため、関数はテストが難しく、スレッドセーフではありません。さらに、呼び出し間で誤って状態を保持します。つまり、2 回目に呼び出すと、機能しなくなります (index古い値がまだ残っているため)。

于 2013-04-01T14:35:23.733 に答える
1

このタイプの検索を再帰的に行う場合は、現在のインデックスを配列に反映する必要があります。

あなたがやっている方法では、 static キーワードのために関数へのすべての呼び出しで同じでindexあるグローバル変数があります。

インデックスはむしろパラメーターである必要があり、関数を再帰的に呼び出すたびに、パラメーターとして index+1 を渡します。

また、再帰呼び出しの値を返す必要があります。そうしないと、何もせず、返された値を保存/処理しません。

于 2013-04-01T14:38:41.467 に答える