递归:
public static void main(String[] args){
int[] array = {1, 2, 3, 4, 5};
for (int i = 1; i <= array.length; i++) {
findChildOrder(0, 1, array, new int[i]);
}
}
public static void findChildOrder(int start, int currentLength, int[] array, int[] childOrder) {
for (int i = start; i < array.length; i++) {
childOrder[currentLength - 1] = array[i];
if (currentLength < childOrder.length) {
findChildOrder(i + 1, currentLength + 1, array, childOrder);
} else {
doSomething(childOrder);
}
}
}
非递归:
stackLength表示子序列长度,stacks存放子序列每个元素在array里对应的下标
public static void main(String[] args){
int[] array = {1, 2, 3, 4, 5};
findChildOrderNonRecursive(array);
}
public static void findChildOrderNonRecursive(int[] array) {
int[] stacks = new int[array.length];
for (int stackLength = 0; stackLength < array.length; stackLength++) {
for (int i = 0; i <= stackLength; i++) {
stacks[i] = i;
}
while (stacks[0] < array.length - stackLength) {
doSomething(stacks, array, stackLength);
if (++stacks[stackLength] >= array.length) {
for (int j = stackLength - 1; j >= 0; j--) {
if (++stacks[j] < array.length - (stackLength - j)) {
int firstValue = stacks[j];
for (int k = j + 1; k <= stackLength; k++) {
stacks[k] = ++firstValue;
}
break;
}
}
}
}
}
}