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.

factorial
n = 3
at: if(n == 0)

Since n is not 0, factorial moves to the else part and calls factorial(2).

factorial
n = 3
at: int r = factorial(n-1);
factorial
n = 2
at: if(n == 0)

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);
factorial
n = 1
at: if(n == 0)

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);
factorial
n = 0
at: if(n == 0)

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.