2017-04-14 99 views
1

我想使用遞歸來計算某個元素的發生,但是我一直得到一個數組越界的錯誤。計數元素

public static void main(String[] args) { 
     int[] a ={70,70,86,53}; 
     int number = 70; 
     int done = occur(number, a); 
     System.out.println(done); 
    } 

    public static int occur(int number, int[] a, int count) { 
     int length = a.length; 
     int count = 0; 
     if (a[0] != number) { 
      count += 0; 
     } else { 
      if (a[0] == number) { 
       count += 1; 
      } 
     } 
     if (length == 0) { 
      return count; 
     } 
     int[] a2 = Arrays.copyOfRange(a, 0, a.length - 1); 
     return occur(number, a2, count); 
    } 

} 
+4

這是第一次,我看到在O(N²)來實現線性搜索。 – Axel

回答

0

您有兩個邏輯錯誤。

1)在遞歸方法中需要3個參數:要搜索的數字,搜索的實際數量和搜索的實際數組。
您沒有爲實際計數指定任何參數。所以這些信息在下一次遞歸調用中丟失了。

2)你比較的第一個元素數組的檢查,如果它的價值相匹配的號碼進行搜索:

if (a[0] == number) { 
    count += 1; 
} 

但你刪除數組的最後一個元素在發送下一次遞歸調用的參數:

int[] a2 = Arrays.copyOfRange(a, 0, a.length - 1); 
return occur(number, a2); 

它會產生不準確的結果。


補充說明:

  • 你有沒有所需的處理。 什麼是從做點:

    if (a[0] != number) { count += 0; }

它不增加計數器。所以,這是無用的

  • 數組副本可以通過添加一個參數,以避免在每次調用傳輸當前索引處理。

下面是一個示例代碼與更正:

public static void main(String[] args) { 
    int[] a = { 70, 70, 86, 53 }; 
    int number = 70; 
    int done = occur(number, 0, a, 0); 
    System.out.println(done); 
} 

public static int occur(int number, int count, int[] a, int index) { 

    if (index == a.length) { 
     return count; 
    } 

    else if (a[index] == number) { 
     count += 1; 
    } 

    return occur(number, count, a, ++index); 
} 
+0

謝謝!:)所有這些都是很好的答案,但這一些似乎工作得最好! – WebNeoRaven

+0

歡迎您:) – davidxxx

0

檢查方法頂部的長度。當長度爲0時,則無法訪問[0]。

而不是每次創建數組您可以傳遞該方法中的索引並從該索引開始下一個遞歸。

0

Arrays.stream(a).filter(n -> a == n).count();

0

很少的東西代替occur(number, a);

  1. 更好傳遞一個索引然後在開始複製數組每次方式更快
  2. 校驗長度(或當前索引是長度)並返回0
  3. 除去如果包含count += 0這是無用
  4. return count + occur(number, a2)更換遞歸從本次迭代

添加數,您可以大大幹脆下來到這個

public static int occur(int n, int i, int[] a) 
{ 
    if(i == a.size()) 
    { 
     return 0; 
    } 
    return a[i] == n ? 1 + occur(n, i+1, a) : occur(n, i+1, a); 
} 
+0

@WebNeoRaven你是什麼意思我通過我作爲索引,並使用它。初始調用(假設你想統計整個數組)是'int count =發生(number,0,a);' – twain249

+0

是的。我的錯。虛驚! – WebNeoRaven