Think of it this way, the function keeps calling itself. That is what recursion is all about. We will evaluate this problem one step at a time.
As long as num is less than or equal to 20, we can say that m9(num) = m9(num+4)+2*num. Look at the following, and read the explanations below:
m9(15)
= m9(15+4) + 2*15 (eqn. 1)
= [ m9( {15+4} +4) + 2*{15+4} ] + 2*15 (eqn. 2)
= [ { -5 } + 2*{15+4} ] + 2*15 (eqn. 3)
= [ 33 ] + 2*15 (eqn. 4)
= 63
(eqn. 1) I have expanded m9(15) to m9(15+4)+ 2*15. Since I cannot reach an answer until I know what m9(15+4) evaluates to, I have to evaluate it next.
(eqn. 2) I expand m9(15+4) the same way I expanded m9(15) the first time, giving me m9( {15+4]} +4) which I placed in square brackets because that is the part that we are working with right now. We will ignore the 2*15, because the new instance of m9 that we just called does not know anything about it; it only knows about what is inside of the square brackets. We still cannot evaluate what is inside of the square brackets until we have evaluated m9( {15+4} +4), so we do that next.
(eqn. 3) Luckily we know that m9( {15+4} +4) is m9(23), and since 23 is greater than 20, we have reached the base case, and we return a -5.
(eqn. 4) Now we know everything we need to know to evaluate what is inside of the square brackets, because they are all integer values, and they give us 33, which we return to the previous call.
(eqn. 5) Now we know everything we need to know to evaluate the rest.
The idea of recursion is this: I don't know the answer of problem A until I solve problem B, which is a variation of type A. I can't solve problem B until I solve problem C, and C is a variation of A also. This chain continues until we get down to the base case. Once we reach the base case we can solve the rest of the equations as we work backwards to where we came from.
This is not the only way to use recursion, but it is a common one, and it is what is used here. Hopefully that gives you a better idea of what is going on at least. Pardon the ugly formatting, it is really hard to communicate mathematical ideas in such a limited text environment.
Also, I just want to add my two bits: recursion is definitely very important in programming. There are TYPES of programming that never really need recursion, but it has tons of uses in everything from database management to game programming. One of the most commonly used applications of recursion are binary trees. Granted, some binary trees can be built using loops, but the result is usually quite messy.
My advice: if you want to take programming seriously, learn ALL of the different techniques and strategies that are used commonly, then decide for yourself what is useful to you.