15C. Detailed Hand Simulation of a Recursive Function
Let's use frames to simulate computation of
factorial(3). To make the simulation easier to show, we break the
statement in the else-part into statements. Here is the modified
definition of factorial.
int factorial(const int n)
{
if(n == 0)
{
return 1;
}
else
{
int r = factorial(n-1);
return n * r;
}
}
Initially, a frame for factorial(3) is created.
Since n is not 0, factorial moves to the else part
and calls factorial(2).
factorial |
n = 3 |
at: int r = factorial(n-1); |
|
|
|
The call to factorial(2) sees that n is 2, not 0, so it
goes to the else part and calls factorial(1).
factorial |
n = 3 |
at: int r = factorial(n-1); |
|
|
factorial |
n = 2 |
at: int r = factorial(n-1); |
|
|
|
Since n is not 0, the call to factorial(1)
calls factorial(0).
factorial |
n = 3 |
at: int r = factorial(n-1); |
|
|
factorial |
n = 2 |
at: int r = factorial(n-1); |
|
|
factorial |
n = 1 |
at: int r = factorial(n-1); |
|
|
|
Since n is 0, the call to factorial(0) returns 1.
factorial |
n = 3 |
at: int r = factorial(n-1); |
|
|
factorial |
n = 2 |
at: int r = factorial(n-1); |
|
|
factorial |
n = 1 |
r = 1 |
at: return n * r; |
|
|
Factorial(1) returns 1*1 = 1.
factorial |
n = 3 |
at: int r = factorial(n-1); |
|
|
factorial |
n = 2 |
r = 1 |
at: return n * r; |
|
|
Factorial(2) returns 2*1 = 2.
factorial |
n = 3 |
r = 2 |
at: return n * r; |
|
|
Finally, factorial(3) returns 3*2 = 6.