我有一个简单的类,使用递归枚举和过程函数计算并最终打印X量的6面模具的所有可能组合。然而,虽然这个程序有效(使用已经找到的枚举过程算法),但我并不完全确定递归究竟是做什么的,它允许类对 ALL 的可能性进行排序。
主要方法是直接调用枚举,
enumerate(N, 0, new int[N]);
枚举方法非常简单,
public static void enumerate(int N, int k, int[] a) {
if (k == N) {
process(a);
return;
}
for (int i = 0; i < 2; i++) {
a[k] = i;
enumerate(N, k + 1, a);
}
}
此时有效调用的进程方法什么都不做,只打印传递给它的数组
public static void process(int[] a) {
for (int i : a) {
System.out.print(i);
}
System.out.println();
}
TL; DR - 当k==n
时,我有一个看似返回的枚举方法 - 也就是说,完整的一系列可能性已经完成。但是,该课程会返回所有可能的组合。究竟什么是递归函数可以实现这一点?为什么在形成完整组合后返回枚举方法时程序不会停止?
答案 0 :(得分:2)
您在此程序中看到的递归类型让我想起了二叉树。
如果您在使用调试器执行程序期间观察变量k
和i
的值并遵循其值,则可以构建二叉树。如果我们考虑表达式(k,i),你可以看到这段代码的执行在下面创建了这个递归树:
int[] a = new int[3];
enumerate(a.length, 0, a);
这是结果树,其值为(k, i)
:
(0, 0)
(1, 0) (1, 1)
(2, 0) (2, 1) (2, 0) (2, 1)
(3, 0) (3, 1) (3, 0) (3, 1) (3, 0) (3, 1) (3, 0) (3, 1)
如果然后使用深度优先从(1,0)和(1,1)节点搜索遍历树,则可以通过向下搜索遍历路径i
的值来重建打印出的值。
使用DFS的遍历结果正是应该在控制台上打印出来的结果:
000 - (1, 0)(2, 0)(3, 0)
001 - (1, 0)(2, 0)(3, 1)
010 - (1, 0)(2, 1)(3, 0)
011 - (1, 0)(2, 1)(3, 1)
100 - (1, 1)(2, 0)(3, 0)
101 - (1, 1)(2, 0)(3, 1)
110 - (1, 1)(2, 1)(3, 0)
111 - (1, 1)(2, 1)(3, 1)