2009-11-25 90 views
1

在執行它之前,我有一些代碼可以做一些測試。基本上在第二次遞歸調用它應該進入這一行(否則如果(sec> = 1){返回測試(s,lowerBounds + middle + 1,upperBounds);})但它不會改變它到另一個否則,如果和更改sec的值。我錯過了什麼嗎?Java遞歸問題

public class Main 
{ 
    private static String[] test = { "aaa", "aab", "aac", "aad", "aae" }; 

    public static void main(String[] args) { 
     System.out.println(test("aab", 0, 4)); 
    } 

    public static int test(String s, int lowerBounds, int upperBounds) { 
     if(upperBounds < lowerBounds || upperBounds > lowerBounds) { 

      int middle = (upperBounds – lowerBounds)/2; 
      int sec = s.compareTo(test[lowerBounds + middle]); 

      if(sec == 0) 
       { return lowerBounds + middle; } 
      else if(sec <= -1) 
       { return test(s, lowerBounds, upperBounds – middle – 1); } 
      else if(sec >= 1) 
       { return test(s ,lowerBounds + middle + 1, upperBounds); } 
     } else { return -1; } 
     return -10; 
    } 
} 

編輯:對不起,我應該說這是我自己的二進制搜索實現。我仍然自己學習編程,所以如果我以某種方式搞砸了,請不要激怒我。

編輯:如果我刪除第一條if語句它看起來好像它工作正常?

回答

4

此行

if(upperBounds < lowerBounds || upperBounds > lowerBounds) 

看起來很可疑。如果你的upperBounds低於你的lowerBounds,那麼middle將是負值。通常,這隻會在遞歸結束時發生(當你找到正確的元素或者它不存在時)。這可能就是爲什麼如果你刪除了這個if語句,你的遞歸工作原理(但是如果你調用這個函數的話會損壞)。

另外,你爲什麼要與測試[lowerBounds + middle]進行比較?

int sec = s.compareTo(test[lowerBounds + middle]); 

二進制排序的想法是,你計算的中間位置(如果這是有道理的),你的邊界,你在與你正在尋找的元素,中間比較的元素。

如果中間更大(並且假設您的數組已被排序),則必須看'左側'。如果如果更低,你看'右側'。由於lowerBounds爲0,因此您的測試只能在第一次遞歸時使用。

希望這有助於。

3

如果(upperBounds < lowerBounds || upperBounds> lowerBounds)

是真對每個數除的情況下upperBounds == lowerBounds