2014-11-06 93 views
-1

我需要幫助創建一個遞歸方法來查找向量中的最大值。該方法應具有以下簽名:在數組遞歸方法中查找最大整型值

public int max(int[] v) 

並使用私人幫助方法。

下面是我試圖使用方法:本

private int biggest(int a, int b){ 
    if(a > b){ 
     return a; 
    } 
    else{ 
     return b; 
    } 
} 

public int maxRecursive(int[] v){ 
    if(v.length > 1){ 
     return biggest(v[0], maxRecursive(Arrays.copyOfRange(v, 1, v.length - 1))); 
    } 
    else{ 
     return v[0]; 
    } 
} 

然而,一切似乎做的是返回數組的中間值。例如:如果數組是'{1,2,3,5,6,7,8} 該方法返回5.

+1

你說有一個Vector被發現,但你的代碼展示了通過一種原始的陣列搜索。這是什麼?另外,你爲什麼要遞歸地做這件事,這是沒有意義的。只需做一個直線運行。 – 2014-11-06 17:03:01

+0

我正在上一門編程課,這是其中一項任務。管理創建一個迭代,但我卡在遞歸方法。 – 2014-11-06 17:12:40

+0

你應該如何處理零大小的數組? – fge 2014-11-06 17:16:32

回答

0

由於您使用的是錯誤的copyOfRange,因此您有一個錯誤的錯誤。它應該是:

maxRecursive(Arrays.copyOfRange(v, 1, v.length)); 

這是因爲to說法是獨家。因此,當您的tov.length - 1時,陣列最終只能看到從1之間的所有內容,最後一個元素是

如有疑問,請閱讀Javadocs

0

你最好有一個方法,發現陣列中最大的到一定的索引:

public static int findMax(int[] arr, int lastPos) { 
    if (lastPos==0) 
     return arr[lastPos]; 
    else 
     return biggest(arr[lastPos], findMax(arr, lastPos-1)); 
} 

,然後最大的是

findMax(arr, arr.length-1); 

這避免了所有陣列複製,這是相當昂貴的。你的代碼做了很多複製,這會使其對大型數組無效。在這個版本中,你傳遞相同的數組,但作爲參考;並且您告訴該方法在考慮陣列時可以走多遠。

關鍵的觀察結果是數組的最大元素是最後一個元素或最後一個元素之外的數組的最大值。這與你的想法基本相同,你從一開始就開始;它只是使終止案例更容易編寫和理解。從的Javadoc您使用的方法(Arrays.copyOfRange

0

直:

原 - 該範圍的初始索引 - 從該範圍是從複製

陣列被複制,包括

到 - 要複製的範圍的最終索引,獨佔。 (該指數可能位於陣列之外。)

強調我的。

0

您必須更改方法maxRecursive

public int maxRecursive(int[] v){ 
    if(v.length > 1){ 
     return biggest(v[0], maxRecursive(Arrays.copyOfRange(v, 1, v.length))); 
    } 
    else{ 
     return v[0]; 
    } 
}