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);                
    }   
}

我通过声明indexas来采取正确的方法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

我通过声明indexas来采取正确的方法static,对吗?

不,index应该是递归函数的参数。

由于static状态的原因,该函数很难测试并且不是线程安全的。此外,它会无意中在调用之间保持状态,这意味着如果您要再次调用它,它将无法正常工作(因为index仍然具有旧值)。

于 2013-04-01T14:35:23.733 回答
1

当递归地执行这种类型的搜索时,您必须传播您当前在数组中的索引。

你这样做的方式,有一个全局变量,由于 static 关键字,index在每次调用你的函数时都是相同的。

索引应该是一个参数,每次递归调用函数时,都将 index+1 作为参数传递。

此外,您必须返回递归调用的值,否则它什么也不做,也不存储/处理返回的值。

于 2013-04-01T14:38:41.467 回答
1

您也可以在不使用静态局部变量的情况下将搜索功能更改为以下内容index

int linearSearch(const int array[], int index, int key, int sizeOfArray)
{
   //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                
    return linearSearch(array, index + 1, key, sizeOfArray);                
 }

唯一的变化是您将起始索引传递给搜索函数。

于 2013-04-01T14:45:03.893 回答