回溯以生成“ n”位的二进制字符串。有人可以解释一下这里的回溯吗?

时间:2018-12-30 04:06:09

标签: algorithm backtracking

要生成n位二进制字符串,我有以下递归解决方案。

public static void main(String[] args) {
    int n = 4;
    int[] array = new int[n];
    generateBinaryStrings(array, n);
}

public static void generateBinaryStrings(int[] array, int N) {
    if (N < 1) {
        System.out.println(Arrays.toString(array));
    } else {
        array[N - 1] = 0;
        generateBinaryStrings(array, N - 1);
        array[N - 1] = 1;
        generateBinaryStrings(array, N - 1);
    }
}

该解决方案效果很好,但是我被告知像许多关于此问题的文章中所说的那样在这里使用了回溯功能。有人可以解释一下这里如何进行回溯功能吗?

3 个答案:

答案 0 :(得分:1)

这不是回溯,这只是纯递归。回溯(通常)是一种递归算法,在这种算法中,一旦知道跟踪并没有用,就可以将其剪切并取回。

答案 1 :(得分:0)

回溯遍历所有不同方式 可以构造解决方案。

array[N-1] = 0;行将当前的最后一个元素设置为0。然后,下一行generateBinaryStrings(array, N - 1);将为N-1个元素的字符串(array [之前的子字符串[ N-1])。这将是所有N个元素的一半解决方案,因为这是针对array[N-1] = 0的。

另一半应该是带有array[N-1] = 1的字符串,这就是接下来的两行代码要做的事情。

答案 2 :(得分:0)

回溯是一种通用算法,用于查找某些计算问题(尤其是约束满足问题)的所有(或某些)解决方案,该算法逐步为该解决方案构建候选对象,并在确定该候选对象后立即放弃候选对象(“回溯”)。候选人可能无法完成有效的解决方案。 可以在这里对回溯进行深入的研究。 https://en.wikipedia.org/wiki/Backtracking 但是就您的问题而言,此处使用的回溯是定义的第一行。 回溯是一种通用算法,用于查找某些计算问题的所有解决方案。 因此,在这里,您将找到长度为'n'的二进制数字的所有可能解,因此它将成为回溯解,而算法bactrack会找到其他解 当知道长度“ n”结束时。 回溯以树状方式进行,如下图所示。 无论何时到达末尾,它都会回溯以获取其他输出,并且由于递归使用堆栈,因此我们按此顺序获取输出。 bactracking tree

这是您的代码获得的输出

[0,0,0,0]

[1、0、0、0]

[0,1,0,0]

[1、1、0、0]

[0,0,1,0]

[1、0、1、0]

[0,1,1,0]

[1,1,1,0]

[0,0,0,1]

[1、0、0、1]

[0,1,0,1]

[1、1、0、1]

[0,0,1,1]

[1、0、1、1]

[0,1,1,1]

[1,1,1,1]