2016-10-01 34 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