public int mystery(int b)
{
if (b == 0) // checks if 5 == 0, which is false
return 0;
if (b % 2 == 0) // checks if 5 is even, which is false
return mystery(b - 1) + 3; // call 1
else
return mystery(b - 1) + 2; // call 2
// stops at call 2 and calls m(4)
}
Call stack
m(4)
m(5)2
Explanation
The comments in the code above show the trace through m(5).
The statement if (b % 2 == 0) when b is 5 could be traced as: checks if 5 % 2, which is 1, is equal to 0, which is false. Since the statement is obviously checking if b is even, it could also be traced as: checks if 5 is even, which is false.
The 2 next to m(5) in the call stack indicates that m(5) stopped at call 2. This will become important when control is later returned to m(5).
The new call to m(4) is added to the top of the call stack. m(5) is suspended waiting for m(4) to return.
The + 2 is ignored because it has not yet been executed.
In the statement return mystery(b - 1) + 2;, return is the last command that executes. Everything to the right of return executes first. The return command in m(5) has not yet executed.