public int mystery(int b)
{
    if (b == 0)
        return 0;
    
    if (b % 2 == 0)
        return mystery(b - 1) + 3; // call 1
    else
        return mystery(b - 1) + 2; // call 2
                                   // finished call 2, got back 0
                                   // adds 2
                                   // stops and returns 2
}

Call stack

m(0)   returns 0
m(1)   returns 2
m(2)1
m(3)2
m(4)1
m(5)2

Explanation

After m(0) returns, control returns to the topmost method on the stack that has not yet returned, which is m(1).

The stack (in the previous step) shows a 2 next to m(1), so call 2 just finished. call 2 returned 0. When a method returns a value, the return value is used in place of the method call.

The statement return mystery(b - 1) + 2;
becomes return 0 + 2;

Forward to Step 9
Back to Step 7
Back to main example