2014-02-09 27 views
1

我的家庭作業要求我通過一個雙精度數組並根據它是否包含負數來返回true或false。問題是我必須使用遞歸函數,而且我不能使用循環。我也不能使用訪問函數之外的任何函數或變量。遞歸找到一個雙數組中的負數

該函數有兩個參數:數組和要檢查的元素數。

我一直在檢查指定數量的元素後,無法停止遞歸。

//what I have so far 
bool anyNegative(const double a[], int n) 
{ 
    if(n <= 0) 
     return false; 

    if(*a < 0) 
     return true; 

    anyNegative(a + 1, n); 
} 

首先,我想到使用計數器,但它不起作用,因爲它每次函數遞歸時都會被重置。

我也試圖指針索引與

if(currentElement == &a[n]) 

其中currentElement是一個指針數組a的第一個元素進行比較。

但是,我想我的程序沒有工作的原因,當我這樣做是因爲「a」被設置爲一個新的價值每次函數遞歸,所以& a [n]將永遠n元素提前currentElement的。

我被卡住了,如果有人能給我一個提示,那就太好了。

+0

如何預期'n'會永遠失敗*'的條件( n <= 0)',然後在下一個傳球突然傳球。 – WhozCraig

回答

1

減少n,因爲你將數組較小

anyNegative(a + 1, n - 1); 
1

您需要降低n,並返回遞歸調用的值。

return anyNegative(a + 1, n - 1); 
+0

Downvoter,爲什麼我的回答不正確? – nothrow

1

你缺少兩件事情,第一你是不是遞減的n值,從而中止條件即可到達。其次,您不會將子執行的結果返回到上一級。

這裏是修改後的代碼:

//what I have so far 
bool anyNegative(const double a[], int n) 
{ 
    if(n <= 0) 
     return false; 

    if(*a < 0) 
     return true; 

    return anyNegative(a + 1, n - 1); 
} 
0

的陣列的大小不能爲負。因此,不要做如此多餘的檢查

if(n <= 0) 
    return false; 

最好是將第二個參數定義爲具有size_t類型。

你的函數是未定義行爲,因爲它沒有返回值時,控制將實現語句

anyNegative(a + 1, n); 

而且不是呼叫以上必須是

anyNegative(a + 1, n -1); 

我會寫的函數通過以下方式

bool anyNegative(const double a[], size_t n) 
{ 
    if (n == 0) return false; 
    return (*a < 0 ? true : anyNegative(a + 1, n - 1)); 
} 
+0

有趣的是,爲什麼我的回答會被投票。 –