2012-08-13 66 views
4

好了,所以我給出的函數二進制搜索遞歸算法問題在C

int bin(int value, int size, int array[]) 

我應該內「[]數組」找到「價值」,但手頭這裏的問題是,在大多數情況下,我們沿着

int bin(int value, int max, int min, int array[]) 

遞歸線的東西,從邏輯上講,是這部分容易得多由於我還可以通過我在,數量以及記憶的大小陣列。

int bin(int array[], int value, int min, int max) 
{ 
    if(max < min) 
     return -1; 
    else 
    { 
     int mid = min + (max - min)/2; 

     if(array[mid] > value) 
      return bin(array, value, min, mid-1); 
     else if(array[mid] < value) 
      return bin(array, value, mid+1, max); 
     else 
      return mid; 
    } 

但是由於我只能傳遞1個整數,我該如何調整這個算法呢? 實質上,我只能做這樣的事情,但我知道它不會在邏輯上起作用。有沒有辦法,我可以看到數組的大小?我試過了,但是這些數字並沒有被正確處理。

int bin(int array[], int value, int size) 
    { 
      int mid = size/2; 

      if(array[mid] > value) 
       return bin(array, value, size-(size/2)); 
      else if(array[mid] < value) 
       return bin(array, value, size+(size/2)); 
      else 
       return mid; 
    } 
+0

請調整您的「家庭作業」標籤等;你的約束肯定聽起來像那樣。提示:在C數組中實際上是指向底層數據類型的指針。所以你可以傳遞一個計算的參數'數組'到函數中。 – Adriaan 2012-08-13 11:55:59

+0

@Adriaan:陣列不是指針。數組是數組。但是,不能將數組作爲函數參數傳遞,並且在該上下文中,數組會衰減爲指向第一個元素的指針。不過,這並沒有改變數組的性質。 – 2012-08-13 12:00:53

回答

13

你需要明確通過基部,以及:

int 
bin(int array[], int value, int size) 
{ 
     int mid = size/2; 

     if(array[mid] > value) 
      return bin(array, value, size/2); 
     else if(array[mid] < value) 
      return bin(&array[mid], value, size/2); 
     else 
      return mid; 
} 

注意到「&陣列[MID]中的 」if(數組[MID] <值)「 的情況下

每次使用base + offset副最小/最大索引搜索數組的正確一半

+0

在任何對bin()的調用中,大小都不應該減小? – erturne 2012-08-13 11:58:44

+1

@erturne好抓;我的代碼仍然沒有解決所有問題(例如,數組中的奇數/偶數個元素),但基本思想是有。 – tbert 2012-08-13 12:18:17

+1

是的。有效。謝謝!是的,有時在我的一些教授課程中有這些古怪的限制。 – Ezrb3zr 2012-08-13 12:44:27

0

使用具有不同參數集的方法的目的是將m使該方法易於爲用戶調用。這在遞歸中很常見。

有一種公開的方法可供用戶使用,其簽名爲
int bin(int value, int size, int array[])

然後應該有私人的內部幫手方法和
int bin(int value, int max, int min, int array[])簽名。

問題是,有人調用這個方法會傳遞數組的大小,而不是開始和結束索引(因爲對於他們來說,開始索引應該總是0,end應該總是大小爲1 ),並且有一個帶有預設參數的方法是不好的做法。

具有開始和結束值(最小值和最大值)的幫助程序方法在遞歸調用中用於更高效的計算,並且隱藏用戶不必要的參數。然後

你的方法應該是這個樣子:

int bin(int value, int size, int array[]) { 
    return bin(value, size - 1, 0, array); 
} 
0
int * binSearch (int *arr,int size, int num2Search) 

{ 

    if(size==1) 

     return ((*arr==num2Search)?(arr):(NULL)); 

    if(*(arr+(size/2))<num2Search) 

     return binSearch(arr+(size/2)+1,(size/2),num2Search); 

    if(*(arr+(size/2))==num2Search) 

     return (arr+(size/2)); 

    return binSearch(arr,(size/2),num2Search); 

} 

在我的功能,你會得到相同的參數和返回值的ADRESS。