2016-06-15 16 views
0

CheckLink機能のために働いていませんelse。再帰関数は、私は、コードの下に持っているが、私はそのは私にStackOverflowのエラーを与えてチェック機能を実行しようとすると、私はそれにそのはまで行くのをデバッグするとき</p> <p>を助けてください

注:私は私のコレクションでこのデータを持っている : {1 = [2、3]、2 = [3]、3 = [4]、4 = [3]、5 = [6] 6 = [5]}

どのように私は2つのノード

private Map<Integer, ArrayList<Integer>> graphList = new HashMap<Integer, ArrayList<Integer>>(); 


private boolean checkLink(ArrayList<Integer> dataListFirst, int match) { 
     if (dataListFirst != null) { 
      for (int data : dataListFirst) { 
       if (data == match) { 
        return true; 
       } else { 
        checkLink(graphList.get(data), match); 
       } 
      } 
     } 
     return false; 
    } 
+2

グラフに周期がある場合はどうなりますか?それは決して終わらない再帰とStackOverlowErrを説明するでしょう。 – Eran

+0

それから、私は与えられた(1,3) –

答えて

0

との間のリンクを見つけることができますあなたが唯一の現在ArrayListのすべての要素を確認した後、再帰呼び出しをしたい私には思えます。

private boolean checkLink(ArrayList<Integer> dataListFirst, int match) 
{ 
    if (dataListFirst != null) { 
     for (int data : dataListFirst) { 
      if (data == match) { 
       return true; 
      } 
     } 
     for (int data : dataListFirst) { 
      boolean found = checkLink(graphList.get(data), match); 
      if (found) 
       return found; 
     } 
    } 
    return false; 
} 

がある場合ので、私は、しかし、これはすべてのケースで動作するかわからない:そして、あなたは、再帰呼び出しによって返された値を使用する必要があります(それはあなたの再帰がreturn true;後に終了しなかった理由があります)グラフ内を循環すると、目的のノードを見つけずに無限回帰に入ることがあります。

private boolean checkLink(ArrayList<Integer> dataListFirst, int match) { 
    if (dataListFirst != null) { 
     for (int data : dataListFirst) { 
      if (data == match || checkLink(graphList.get(data), match)) { 
       return true; 
      } 
     } 
    } 
    return false; 
} 

このコード:再帰呼び出しは、あなたの要素を見つけるかどうかを確認するためにあなたがあなたのコードを変更することができ

if (data == match) { 
    return true; 
} else { 
    checkLink(graphList.get(data), match); // <--- Return value unused 
} 

2

あなたはあなたの再帰呼び出しのretun値を使用していませんグラフにサイクルがある場合でも問題はありますが、同じ値をもう一度チェックしようとすると関数内でfalseを返す可能性があります。

// Just call the recursive function with an empty list of elements 
private boolean checkLink(ArrayList<Integer> dataListFirst, int match) { 
    return checkLink(dataListFirst, match, new ArrayList<Integer>()); 
} 


private boolean checkLink(ArrayList<Integer> dataListFirst, int match, List<Integer> nodes) { 
    if (dataListFirst != null) { 
     for (int data : dataListFirst) { 
      if (nodes.contains(data)) { 
       return false; 
      } 
      nodes.add(data); 
      if (data == match || checkLink(graphList.get(data), match, nodes)) { 
       return true; 
      } 
     } 
    } 
    return false; 
} 
+0

のリンクをチェックすることができます。このデータ{1 = [2,3]、2 = [3]、3 = [4]、4 = [3]、5 = [6]、6 = [5]} –

+0

これは正しいと思われます。 4 = [3]および3 = [4]。 4は1 –

+0

とリンクされていません1-> 3-> 4:パスを持っています:(もしそのような場合にのみ1,6が偽を返さなければならない –

関連する問題

 関連する問題