2011-11-15 20 views
4

どの配列でも最大の要素を得るために再帰を使うという割り当てがあります。私は、最大の要素が配列の最後のものでない限り動作する次のコードを持っています。再帰を使用して配列の中で最大の要素を得る

これを修正する方法がわかりません。

if (myArray.length == 1) 
{ 
    return max; 
} 

はに置き換えます:一つだけの要素を持つ配列の場合

if (myArray.length == 1) 
{ 
    return myArray[0] > max ? myArray[0] : max; 
} 

は、あなたが以前の最大を返す

import java.util.Scanner; 
public class RecursionLargestInArray 
{ 
public static void main (String[] args) 
{ 
    int max = -999; 
    Scanner scan = new Scanner (System.in); 
    System.out.print("Enter the size of the array: "); 
    int arraySize = scan.nextInt(); 
    int[] myArray = new int[arraySize]; 
    System.out.print("Enter the " + arraySize + " values of the array: "); 
    for (int i = 0; i < myArray.length; i++) 
     myArray[i] = scan.nextInt(); 
    for (int i = 0; i < myArray.length; i++) 
     System.out.println(myArray[i]); 
    System.out.println("In the array entered, the larget value is " 
         + getLargest(myArray, max) + "."); 
} 

public static int getLargest(int[] myArray, int max) 
{  
    int i = 0, j = 0, tempmax = 0; 
    if (myArray.length == 1) 
    { 
     return max; 
    } 
    else if (max < myArray[i]) 
    { 
     max = myArray[i]; 
     int[] tempArray = new int[myArray.length-1]; 
     for (i = 1; i < myArray.length; i++) 
     { 
      tempArray[j] = myArray[i]; 
      j++; 
     } 
     tempmax = getLargest(tempArray, max); 
     return tempmax; 
    } 
    else if 
    { 
     int[] tempArray = new int[myArray.length-1]; 
     for (i = 1; i < myArray.length; i++) 
     { 
      tempArray[j] = myArray[i]; 
      j++; 
     } 
     tempmax = getLargest(tempArray, max); 
     return tempmax; 
    } 
} 
} 
+0

でそれを呼び出す再帰を開始します。最後に検査した索引を渡すと、すべてのステップで新しい配列を作成する必要はありません。 – helpermethod

+0

最後の要素が最大*の場合にのみ、このコードが機能しないのは確実ですか?それは私のためにコンパイルされません。 – Mike

+2

@Mike - 最後に 'else if'は' else'でなければならないと思います。私はそれを投稿中の誤植に帰した。 –

答えて

6

あなたの第一の条件は問題です。 maxが最後の要素であれば、それはスキップされます。

+0

ありがとうございます。投稿後にエラーがどこにあるのかを確認しましたが、修正する方法についてはわかりませんでした。あなたの答えは完璧です。 –

+0

@NYCCanuck助けてうれしいです:) –

3

最後の要素を評価することはありません。配列のサイズが1のときにmaxを返すだけなので、実際には配列の最終要素をチェックすることはありません。

また、コメントは、毎回配列のコピーを作成するのではなく、再帰するたびに関数に現在のインデックスを渡すのはなぜですか?

2

配列の長さが1の場合、getLargestmaxに対して(単一の)配列要素をテストしていません。 maxを返すだけです。そのため、常に最後の要素をスキップしています。

脇に、maxを-999の任意の値の代わりにInteger.MIN_VALUEに初期化する方がよいでしょう。

あなたのコードをいったん有効にすると、まだそれはひどく非効率です。あなたはフィードバックを得るためにcodereview.stackexchange.comに投稿することを検討するかもしれません。

+0

ありがとうございます。私はそれが最良の方法ではないかもしれないことを知っています。まだ基本的なJavaだけを学ぶだけで、私は割り当て完了のために必要なすべてです。しかし、あなたも同様に投稿します。 –

+0

+1はInteger.MIN_VALUEです。 – Thor84no

2

分割と征服はどうですか?もちろん温度の

private static int findLargest(int lowerLimit, int upperLimit) { 
    if (lowerLimit == upperLimit) { 
     return temp[lowerLimit]; 
    } else if (upperLimit - lowerLimit == 1){ 
     return Math.max(temp[upperLimit], temp[lowerLimit]); 
    } else { 
     int pivot = (upperLimit - lowerLimit + 1)/2; 
     int firstHalf = findLargest(lowerLimit, lowerLimit + pivot); 
     int secondHalf = findLargest(upperLimit - pivot , upperLimit); 
     return Math.max(firstHalf, secondHalf); 
    } 
} 

..グローバル配列で、あなただけの小さなヒントfindLargest(0、temp.length)

関連する問題