場景分析
如下代碼是 6 層 for 循環。
ublic void forSix() {
String preFix = "101";
String postFix = "11";
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
for (int k = 0; k < 2; k++) {
for (int l = 0; l < 2; l++) {
for (int m = 0; m < 2; m++) {
for (int n = 0; n < 2; n++) {
// operation
System.out.println(preFix+i+j+k+l+m+n+postFix);
}
}
}
}
}
}
}
如果碰到更為復雜的應用場景,可能存在更深層次的嵌套 for 循環,如 10、13層等,乃至于更多。
如何簡化 for 循環的層次?可以使用遞歸解決問題。
遞歸優化
ublic static final String PRE_FIX = "101";
public static final String POST_FIX = "11";
public final StringBuilder sb = new StringBuilder();
public void simpleFor(int level) {
if (level > 6) {
return;
}
for (int i = 0; i < 2; i++) {
sb.Append(i);
if (level == 6) {
System.out.println(PRE_FIX + sb + POST_FIX);
}
simpleFor(level + 1);
sb.deleteCharAt(sb.length() - 1);
}
}
新的問題
以上代碼每一層 for 循環的數組都是相同,如果每一層需要循環的數組不同該怎么辦?
可以使用 Map<Integer, Integer[]> 保存相關數組,索引為 level
.
改進版遞歸代碼
ublic static final String PRE_FIX = "101";
public static final String POST_FIX = "11";
public final StringBuilder sb = new StringBuilder();
public final Map<Integer, Integer[]> integerMap = new HashMap() {{
put(1, new Integer[]{0,1,2,3,4,5,6,7,8,9});
put(2, new Integer[]{0,1,2,3,4,5,6,7,8,9});
put(3, new Integer[]{0,1,2,3,4,5,6,7,8,9});
put(4, new Integer[]{0,1,2,3,4,5,6,7,8,9});
put(5, new Integer[]{0,1,2,3,4,5,6,7,8,9});
put(6, new Integer[]{0,1,2,3,4,5,6,7,8,9});
}};
public void simpleForOptimize(int level) {
if (level == 7) {
return;
}
Integer[] integers = integerMap.get(level);
for (Integer integer : integers) {
sb.append(integer);
if (level == 6) {
System.out.println(PRE_FIX + sb + POST_FIX);
}
simpleForOptimize(level + 1);
sb.deleteCharAt(sb.length() - 1);
}
}