2016-11-21 2 views
-2

配列から重複する値を見つけるためのコードを提供するのに助けてくれる人はいますか?ここでの条件はループ文ではありません。私は再帰メソッドを試しましたが、うまくいきません。 Plsの誰もが私にこれを助ける。ループを使用せずに配列から重複する値を見つける方法

私の試み:

public static void main(String[] args) { 
    Integer a[] = { 1, 2, 7, 3, 4, 5, 2, 7 }; 
    ArrayList<Integer> al = new ArrayList<Integer>(Arrays.asList(a)); 
    if (duplicate(al) == true) { 
     System.out.println("Duplicate"); 
    } 
} 

static int i = 1; 

private static boolean duplicate(ArrayList<Integer> al) { 

    if (al.get(i) != null) { 
     if (al.get(i - 1) == al.get(i)) { 
      System.out.println("Duplicate are : " + al.get(i)); 
     } 
    } else { 
     return true; 
    } 
    i++; 
    return duplicate(al); 
} 
+0

あなたの試行を表示できますか? – Li357

+0

誰がこの問題にばかげた "no loops"条件を付けましたか?彼らはあなたが再帰を使うことを期待していたのでしょうか、それとも、ストリーム全体をやり遂げることができる組み込みのライブラリメソッドがあると思っていましたか?セットを使うことは許されていますか?あなたが使用することを許可されていないことはありますか?これは、プログラミングの問題や学習の練習ではなく、パズルのように見えます。 – ajb

+0

また、期待される出力は何ですか?重複があるかどうかを言うために「はい」または「いいえ」とされているだけですか、重複を見つけるはずですか? – ajb

答えて

0

これが問題のポイントが何であるか疑問に私をリードされ、再帰のために良いユースケースではありません。しかし、私が見てきたLISPのプログラマーは、伝統的にすべてを再帰的に使用していたことに気付く価値があります。言語の初期のバージョンでは、ループ構造を持っていない可能性があります。このようにプログラミングすると、他の言語のループとなるアルゴリズムに対して再帰を使用する方法を理解することに慣れます。

主な技術は、ローカル変数を実行する必要があるものを把握し、それらをパラメータとして再帰ヘルパー関数に渡すことです。

ループでこの問題を解決するには、最初はSetを定義しますが、これは最初は空です。私は配列を調べるとき、私は:(1)配列要素がすでにセットに入っているかどうかを確認し、それがあればtrueを返します。 (2)要素をセットに追加します。

ここで、Setは、実行する必要がある変数です。配列インデックスは別の「実行変数」です。 (古典的なLISPでは、 "リストの残りの部分"を意味するcdr関数を使うだけなので、インデックスを維持する必要はありません; Javaの場合は簡単ではないと思いますArrayList)外側のメソッドが空のセットにセットを初期化し、それをヘルパーを呼んでこのセットを、とします

private boolean hasDuplicateHelper(ArrayList<Integer> a, int currentIndex, Set<Integer> alreadySeen) { ... } 

:あなたはSetパラメータとして「現在のインデックス」を持っている再帰的な方法をお勧めします0を現在のインデックスとして使用します。再帰的方法は、(1)現在の要素を見て、それがalreadySeenにあるかどうかを確認し、返された場合はtrueを返します。 (2)現在の要素をセットに追加する。 (3)新しいセットをalreadySeenパラメータとして使用し、現在のインデックスに適切な新しい値を設定してメソッドを再帰的に呼び出します(これを理解できるようにします)。

私はあなたに、どのように停止するかなどの詳細を説明します。

EDIT:これで、希望の結果が「はい」または「いいえ」の代わりに重複した値を印刷することが明らかになったので、何かを変更する必要があります。しかし、私は、方法の結果をすべての重複のセットを含むSet<Integer>に変更するだけでこれができると思います。重複が発生する索引や各重複が発生する回数など、より多くの情報が必要な場合は、異なる結果構造を使用する必要があります。

0

ループステートメントを使用せずに配列から重複数を見つけるコードを完成しました。コードを完成させるために2回の再帰を実装しました。以下のコードを確認してください

static int size; 

public static void main(String[] args) { 

    Integer a[] = { 2, 10, 6, 1, 2, 4, 6, 10, 1 }; 
    ArrayList<Integer> al = new ArrayList<Integer>(Arrays.asList(a)); 
    size = a.length - 1; 
    findDuplOne(al, 0); 
} 

static int i = 0; 

private static void findDuplOne(ArrayList<Integer> al, int i) { 

    if (i <= size) { 
     int valOne = al.get(i); 
     i++; 
     findDuplTwo(al, i, valOne); 
     findDuplOne(al, i); 
    } 
} 

private static void findDuplTwo(ArrayList<Integer> al, int i, int compareVal) { 
    if (i <= size) { 
     int valOne = al.get(i); 
     if (compareVal == valOne) { 
      System.out.println("Duplicate is " + compareVal); 
     } 
     i++; 
     findDuplTwo(al, i, compareVal); 
    } 
} 
関連する問題