Я думаю, у вас все хорошо, используя char[]
. Это быстро и точно.
Я бы сказал, что большинство проблем рекурсии, с которыми вы сталкиваетесь на практике, не соответствуют этой схеме. Это потому, что обычно при проблемах, требующих рекурсии, вы выполняете поиск в дереве поиска для одной определенной цели (один конкретный листовой узел в дереве). Вы выполняете итерацию: вы пытаетесь посетить каждый листовой узел дерева и выполнить действие для каждого.
При использовании общих алгоритмов поиска (например, поиска в глубину) вам не нужно будет готовить результат по мере повторения, а скорее как раскручивать после того, как вы нашли цель.
Но для случаев, когда вы делаете, char[]
прекрасно работает. Вы в основном моделируете стек через параметры sol
и k
(sol хранит данные, в то время как k указывает на вершину стека). Как заметили другие, вы можете использовать стек напрямую (передавая реализацию Deque<Character>
, обычно LinkedList
).
На мой взгляд ArrayList
- это шаг назад. Если вы собираетесь использовать коллекцию, используйте коллекцию, созданную для этой проблемы.
Редактировать: Вот непроверенная реализация, использующая вместо этого Deque:
public static void printSol(int cn, int on, Deque<Character> sol) {
if (on == 0 && cn == 0) {
System.out.println("");
for ( Iterator<Character> it = sol.descendingIterator(); it.hasNext(); ) {
System.out.println(it.next());
}
}
else {
if (on > 0) {
if (cn > 0) {
sol.push('(');
printSol(on - 1, cn, sol);
sol.pop();
}
}
if (cn > on) {
sol.push(')');
printSol(on, cn - 1, sol);
sol.pop();
}
}
}
//...
printSol(3, 3, new ArrayDeque<Character>(6));
Как видите, очень мало изменений.
Редактировать 2: Одна вещь, которую мы вообще не обсуждали для этой конкретной проблемы, это StringBuilder
.
StringBuilder - это изменяемый тип String, который позволяет легко добавлять и удалять символы. Это было бы отличным решением и для этой проблемы:
public static void printSol(int cn, int on, StringBuilder sol) {
if (on == 0 && cn == 0) {
System.out.println(sol);
}
else {
if (on > 0) {
if (cn > 0) {
sol.append('(');
printSol(on - 1, cn, sol);
sol.deleteCharAt(sol.length()-1);
}
}
if (cn > on) {
sol.append(')');
printSol(on, cn - 1, sol);
sol.deleteCharAt(sol.length()-1);
}
}
}