が可能ホップを計算するクラスの実装である:
public class HopCalculator {
private int[] input;
public HopCalculator(int[] input) {
this.input = input;
}
入力アレイが構築時間で与えられました。これで、さまざまな長さ(ホップ数)の異なるルートを照会できます。 出力は、可能なルートを含むSetです。 各ルートは、通過する番号を含むアレイリストです。
public Set<ArrayList<Integer>> findPossibleHops(int d) {
Set<ArrayList<Integer>> options = new HashSet<>();
ArrayList<Integer> option = new ArrayList<>();
option.add(input[0]);
findPossibleHopsRecursive(options, option, d-1, 1, input.length-2);
return options;
}
private void findPossibleHopsRecursive(Set<ArrayList<Integer>> options, ArrayList<Integer> option, int d, int begin, int end) {
if (d==0) {
option.add(input[end+1]);
options.add(option);
}
else {
if (end - begin + 1 == d) {
option.add(input[begin]);
findPossibleHopsRecursive(options, option, d - 1, begin + 1, end);
} else {
ArrayList<Integer> option1 = new ArrayList<>();
option1.addAll(option);
option1.add(input[begin]);
findPossibleHopsRecursive(options, option1, d - 1, begin + 1, end);
ArrayList<Integer> option2 = new ArrayList<>();
option2.addAll(option);
findPossibleHopsRecursive(options, option2, d, begin + 1, end);
}
}
}
}
ありがとうございました。再帰は時には非常に混乱する可能性があります。特に、私のような初心者のために。 – user3243499
冗談なし。再帰的な組み合わせおよび置換コードは、最も一般的な言語で容易に利用可能である。あなたは、一般的に再帰に関するメモを必要とし、SOまたはインターネット全体を検索し、 "再帰を説明するベースケース"を探します。それはあなたに有用なヒット率の高い割合を与えるはずです。 – Prune