2016-10-01 99 views
0

我在理解递归时遇到了困难。我在这里寻找一些反馈,看看这个程序的外观。使用递归的成员测试

问题::: 写一个名为isMember的递归布尔函数。该函数应接受三个参数:整数数组,指示数组中元素数的整数以及要搜索的整数值。如果在数组中找到该值,该函数应该返回true;如果找不到该值,则返回false。在程序中演示如何使用该函数,要求用户输入一个数字数组和要搜索的值。

我有什么::

#include <iostream> 

using namespace std; 

bool isMember(int[],int,int); 


int main() 
{ 
    const int SIZE = 10; 
    int numSearch; 
    int elementz[SIZE]; 

    for(int i = 0; i < SIZE; i++) 
    { 
     cout << "Element " << i + 1 << "\t"; 
     cin >> elementz[i]; 
    } 

    cout << "Enter element to search\n"; 
    cin >> numSearch; 

    bool value = isMember(elementz,SIZE,numSearch); 

    if(value ==1) 
     cout << "Element is found\n"; 
    else 
     cout << "Element not found\n"; 

    return 0; 
} 


bool isMember(int arr[], int sizze, int num) 
{ 
    if(arr[sizze] == num) 
     return true; 
    else 
     isMember(arr,sizze -1, num); 
} 
+0

对于isMember函数(当sizze为-1时),您将需要一个假的情况。除此之外 - 是的,这是一个递归函数。它应该返回isMember(arr,sizze - 1,num)而不是仅调用isMember(arr,sizze - 1,num),以便返回值可以将调用堆栈向上移至原始调用函数。 – user3486184

回答

0

如果if子句是假的你的函数不返回。另外,请记住,索引从0开始,而不是1(以及为什么sizze?)。

我建议从3个数值开始,而不是10个。这样您就可以手动跟踪和展开连续的调用。

0

为了使递归正常工作,您不仅需要“有条件停止”,还需要一个无条件停止。

在你的例子中,你只提供了一个条件停止。要使它正常工作,请尝试如下所示:

bool isMember(int arr[], int sizze, int num) 
{ 
    if (sizze < 0) // "inconditional stop" 
     return false; 

    if(arr[sizze] == num) // conditional stop. It could happen or not 
     return true; 
    else 
     isMember(arr,sizze -1, num); 
} 
+0

好甜,谢谢。一个更快的问题。有没有发现元素的情况? –

+0

这取决于你如何填充你的数组 – Amadeus