Java での実装は以下のとおりです。
public static Integer[] recurse(int i, int li, int arr[]) {
if(i == arr.length)
return new Integer[0];
boolean choice = (li == -1) || arr[li] < arr[i];
/* now you have choice to choose it or skip it */
if(choice) {
/* choose it */
ArrayList<Integer> l = new ArrayList<Integer>();
l.add(i);
for(Integer v : recurse(i + 1, i, arr)) {
l.add(v);
}
/* dont choose it */
ArrayList<Integer> r = new ArrayList<Integer>();
for(Integer v : recurse(i + 1, li, arr)) {
r.add(v);
}
/* return largest */
return l.size() > r.size() ? l.toArray(new Integer[0]) : r.toArray(new Integer[0]);
}
/* skip and proceed */
return recurse(i + 1, li, arr);
}
それはそれがどのように呼ばれるべきかです:
public static void main(String[] args) {
findLargest(1, 4, 9, 2, 6, 7, 3, 5, 8, 10);
}
public static void findLargest(int ... vals) {
Integer[] longest = recurse(0, -1, vals);
for(Integer i : longest) {
System.out.println(vals[i]);
}
}
上記の呼び出しの結果は1, 2, 3, 5, 8, 10