It may help you to see the recursion by placing print statements before each call to printBalanced and also a print statement as the first line of each printBalanced method definition. See below:
public class BalancedStrings {
public static void printBalanced(String prefix, int a, int b) {
System.out.println( "printBalanced called prefix = " + prefix + " a = " + a + " b = " + b );
if (a > 0) {
System.out.println( "printBalanced calling printBalanced with prefix = " + prefix + " a-1 = " + (a-1) + " b = " + b );
printBalanced(prefix + "a", a - 1, b);
}
if (b > 0) {
System.out.println( "printBalanced calling printBalanced with prefix = " + prefix + " a = " + a + " b-1 = " + (b-1) );
printBalanced(prefix + "b", a, b - 1);
}
if (a == 0 && b == 0)
System.out.println(prefix);
}
public static void printBalanced(int n) {
System.out.println( "printBalanced called n = " + n );
if (n % 2 == 0) {
printBalanced("", n / 2, n / 2);
}
}
public static void main(String[] args) {
printBalanced(4);
}
}
Also, printBalanced is also said to be an overloaded method because it has two "method signatures" which basically means that it is defined more than once and each method definition has a different set of variables that are passed to the method.
Basically, printBalanced will keep calling itself until variables a and b are decremented to zero. Then it will printout the resulting prefix that it keeps accumulating.
Also, all of this magic can happen because each method call will push the current state of prefix, a and b onto the call stack. The stack is then unwound when the method finally returns without making a recursive call.
I hope that this helps! Recursion can be difficult to understand. You can also trace the calls manually by playing computer yourself and tracing through the execution of the methods writing down on paper the values of prefix, a and b that will be pushed onto the call stack.
Here's the output of the program with the tracing prints included:
C:\Users\>java BalancedStrings
printBalanced called n = 4
printBalanced called prefix = a = 2 b = 2
printBalanced calling printBalanced with prefix = a-1 = 1 b = 2
printBalanced called prefix = a a = 1 b = 2
printBalanced calling printBalanced with prefix = a a-1 = 0 b = 2
printBalanced called prefix = aa a = 0 b = 2
printBalanced calling printBalanced with prefix = aa a = 0 b-1 = 1
printBalanced called prefix = aab a = 0 b = 1
printBalanced calling printBalanced with prefix = aab a = 0 b-1 = 0
printBalanced called prefix = aabb a = 0 b = 0
aabb
printBalanced calling printBalanced with prefix = a a = 1 b-1 = 1
printBalanced called prefix = ab a = 1 b = 1
printBalanced calling printBalanced with prefix = ab a-1 = 0 b = 1
printBalanced called prefix = aba a = 0 b = 1
printBalanced calling printBalanced with prefix = aba a = 0 b-1 = 0
printBalanced called prefix = abab a = 0 b = 0
abab
printBalanced calling printBalanced with prefix = ab a = 1 b-1 = 0
printBalanced called prefix = abb a = 1 b = 0
printBalanced calling printBalanced with prefix = abb a-1 = 0 b = 0
printBalanced called prefix = abba a = 0 b = 0
abba
printBalanced calling printBalanced with prefix = a = 2 b-1 = 1
printBalanced called prefix = b a = 2 b = 1
printBalanced calling printBalanced with prefix = b a-1 = 1 b = 1
printBalanced called prefix = ba a = 1 b = 1
printBalanced calling printBalanced with prefix = ba a-1 = 0 b = 1
printBalanced called prefix = baa a = 0 b = 1
printBalanced calling printBalanced with prefix = baa a = 0 b-1 = 0
printBalanced called prefix = baab a = 0 b = 0
baab
printBalanced calling printBalanced with prefix = ba a = 1 b-1 = 0
printBalanced called prefix = bab a = 1 b = 0
printBalanced calling printBalanced with prefix = bab a-1 = 0 b = 0
printBalanced called prefix = baba a = 0 b = 0
baba
printBalanced calling printBalanced with prefix = b a = 2 b-1 = 0
printBalanced called prefix = bb a = 2 b = 0
printBalanced calling printBalanced with prefix = bb a-1 = 1 b = 0
printBalanced called prefix = bba a = 1 b = 0
printBalanced calling printBalanced with prefix = bba a-1 = 0 b = 0
printBalanced called prefix = bbaa a = 0 b = 0
bbaa