import java.util.Arrays; class Ideone { } static <T> void dfs(T[] val, Arr<T> arr) { if (arr.size() == 0) { } for (int i = 0; i < arr.size(); i++) { val[arr.size()-1] = arr.get(i); dfs(val, new Arr2<T>(arr, i)); } } } interface Arr<T> { T get(int i); int size(); } class Arr1<T> implements Arr<T> { final T[] arr; Arr1(T[] arr) { this.arr = arr; } public T get(int i) { return arr[i]; } public int size() { return arr.length; } } class Arr2<T> implements Arr<T> { final Arr<T> arr; final int omit, length; Arr2(Arr<T> arr, int omit) { this.arr = arr; this.omit = omit; length = arr.size()-1; } public T get(int i) { return i < omit ? arr.get(i) : arr.get(i + 1); } public int size() { return length; } }
Standard input is empty
[D, C, B, A] [C, D, B, A] [D, B, C, A] [B, D, C, A] [C, B, D, A] [B, C, D, A] [D, C, A, B] [C, D, A, B] [D, A, C, B] [A, D, C, B] [C, A, D, B] [A, C, D, B] [D, B, A, C] [B, D, A, C] [D, A, B, C] [A, D, B, C] [B, A, D, C] [A, B, D, C] [C, B, A, D] [B, C, A, D] [C, A, B, D] [A, C, B, D] [B, A, C, D] [A, B, C, D]