You have already mentioned it's uses. The difference it produces is in the execution time of the program. That is, if a small function is called many a times in a program then, each time the control has to jump and then come back to the calling program,thereby consuming much time, just for the execution of few lines of code.
If such a small function that is called repeatedly, is defined within the program(by the compiler itself), the time consuming jump can be avoided thereby,improving the response time!
Now,if the called function is too long then, defining it is inline would make the calling program too long and you won't get the benefit of improving the execution time.
Also,if the function is to be called just once,defining it as inline won't be a wise decision either!
Recursive functions is useful when you require the same function to perform the task meant for that function.
Following is the factorial function,finding the factorial using recursion.
fact(int i)
{
if(i>1)
f=i*fact(i-1);
}