C ++:运行时错误,简单的递归搜索功能

时间:2013-04-01 14:33:02

标签: c++ arrays recursion

所以我在这里有一个程序,它应该做一个非常简单的工作,搜索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 个答案:

答案 0 :(得分:4)

你的错误是那个

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

应该是

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

当密钥不相等时,您不会返回任何值。

另外静态指数很糟糕,正如已经说过的那样。

答案 1 :(得分:3)

  

我正在采用正确的做法,将index声明为static,对吧?

没有。相反,index应该是递归函数的参数。

由于static状态,该函数很难测试,并且不是线程安全的。此外,它无意中在调用之间保持状态,这意味着如果你第二次调用它,它将无效(因为index仍然具有旧值)。

答案 2 :(得分:1)

以递归方式执行此类搜索时,必须传播当前在数组中的索引。

你正在这样做,有一个全局变量index,因为static关键字,在你的函数的每次调用中都是相同的

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

此外,您必须返回递归调用的值,否则它不会执行任何操作,也不会存储/处理返回的值。

答案 3 :(得分: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);                
 }

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