2016-04-03 8 views
1

私は以下のアルゴリズムを持っています。目標は一連の数値の可能な順列をすべて見つけ、標識を切り替えることです。木の葉ノードに到達すると、リスト上で反復処理を行う別のメソッドを呼び出して、その順列の合計がシリーズ内の数値に等しいかどうかを確認します。また、シリーズのサブセットが与えられた数よりも少ないかどうかを調べるためのアルゴリズムを試しています。たとえば60,35,40という数字の場合、60 + 40 < 110です。問題は、ツリー内のブランチが必要なものであれば、他のブランチがまだ調査されていることです。どうやってこれを中断できますか?今、私が持っているすべては、上記を見るとsystem.exit(1);実行を終了する前に値を返す再帰アルゴリズムを取得するにはどうすればよいですか?

public static int PlusMinus(Node start, Node node, int Sum){ 
    Node head = start; 
    boolean Success = false; 
    if(node != null){ 
     PlusMinus(head, node.next, node.item+Sum); 
     PlusMinus(head, node.next, node.item*(-1)+Sum); 
     return Sum; 
    } 

    else{ 
     Success = getSum(Sum,start); 
     if(Success == true){ 
      System.out.println("Yes"); 
      System.exit(1); 
      return 1; 
     } 
    } 
    return 0; 
} 

で、私の本来の意図は、それが呼び出しプログラムにリーフノードの合計を返すようにしました。プログラムをステップ実行することからわかるように、右端の枝が正しい順列であれば、その葉ノードの戻り値で終了するだけではありません。それはまだ親に戻り、次のブランチのテストに進みます。

+0

合計を返し、これらの2つのメソッドを呼び出すポイントは何ですか? – Natecat

+0

制御フローに 'System.exit()'を使わないでください。それは非常に悪いデザインです。ユーザーは、そのメソッドが値を返すことを期待しますが、JVM全体を停止するわけではありません。 –

答えて

1

戻り値は、検索した合計を見つけたかどうかを示すブール値でなければなりません。メソッドによって返されている現在の値を使用していないので、必要がないように見えます。

public static boolean PlusMinus(Node start, Node node, int Sum){ 
    Node head = start; 
    if(node != null) { 
     // you should return true if either of the recursive calls returned true 
     if (PlusMinus(head, node.next, node.item+Sum)) 
      return true; 
     return PlusMinus(head, node.next, node.item*(-1)+Sum); 
    } else { 
     return getSum(Sum,start); 
    } 
} 

EDIT:

私はあなたのgetSumメソッドが何をするかわかりませんが、あなたがそれを必要としないように見えます。現在のノードが合計に加わる記号に応じて、Sum-node.itemまたはSum+node.itemの次の再帰呼び出しに渡し、リーフノードに到達したときに0に達したかどうかを確認する必要があります。

public static boolean PlusMinus(Node start, Node node, int Sum){ 
    if(node != null) { 
     // you should return true if either of the recursive calls returned true 
     if (PlusMinus(head, node.next, Sum - node.item)) 
      return true; 
     return PlusMinus(head, node.next, Sum + node.item); 
    } else { 
     return Sum == 0; 
    } 
} 
+1

最後の 'return false'は冗長です。 –

+0

@ Psioniaxコードで修正を加えましたが、今は冗長です。 – Eran

関連する問題