基本的递归枚举解释

时间:2018-01-30 18:06:37

标签: java recursion enumeration

我有一个简单的类,使用递归枚举和过程函数计算并最终打印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时,我有一个看似返回的枚举方法 - 也就是说,完整的一系列可能性已经完成。但是,该课程会返回所有可能的组合。究竟什么是递归函数可以实现这一点?为什么在形成完整组合后返回枚举方法时程序不会停止?

1 个答案:

答案 0 :(得分:2)

您在此程序中看到的递归类型让我想起了二叉树

如果您在使用调试器执行程序期间观察变量ki的值并遵循其值,则可以构建二叉树。如果我们考虑表达式(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)