回溯递归问题以解决平衡括号

时间:2019-06-06 15:30:55

标签: java recursion backtracking parentheses

我需要了解如何从递归函数回溯。我知道如何对阶乘或斐波那契等基本功能进行处理。对于这个问题,我不理解。

我尝试消除第二个递归调用中的其他条件,但它也会生成所有可能的括号集,包括不平衡的括号集。

public final class Example {
    public static void parentheses(int left, int right, String str) {
        if (left == 0 && right == 0) {
            System.out.print(str);
            System.out.print(", ");
        }

        if (left > 0) {
            str += "(";
            parentheses(left - 1, right, str);
        }

        if (right > 0 && right > left) {
            str += ")";
            parentheses(left, right - 1, str);
        }
    }

    public static void main(String[] args) {
        parentheses(3, 3, "");
    }
}

我希望结果是所有可能的圆括号,但是在每次递归调用后,我又得到了1个左圆括号。预期输出为:

  

(((())),(()()),(())(),()(()),()()(),

我得到的输出是:

  

(((())),((()()),((()()(),(()(())),(()(()(),

1 个答案:

答案 0 :(得分:0)

问题出在下面。

 str += "(";

您每次都创建一个新的字符串对象,并将其传递给递归调用。结果,每个递归调用对字符串对象都有不同的值,因此您期望的递归失败。字符串在Java中是不可变的。

将您的代码更改为以下代码:

        public static void parentheses(int left, int right, String str) {

        if ( right==0 && left==0) {
            System.out.print(str);
            System.out.print(", ");

        }
        if (left > 0) {
            parentheses(left-1, right, str +"(" ); // New object will be created but its value will be dereferenced from the old one and attached to the new one.
            // As a result all our manipulation of string we did will be saved.
        }
        if ( right >0 && right > left) {
            parentheses(left, right - 1, str +")" );
        }
    }

输入:

parentheses(3,3,""); // Function call

输出:

((())), (()()), (())(), ()(()), ()()(),