Java Reference
In-Depth Information
15.3
Execution of recursive calls
Understanding how a recursive method call is executed and understanding what
a recursive method call does are two different activities. Separate the two com-
pletely in your mind.
Understanding what a method call does requires looking at the specification
of the method. Make a copy of the specification and replace all occurrences of
the method parameters by the arguments of the call; the result is a command, usu-
ally in a mixture of English and math, that is equivalent to the method call. It
does not matter whether the method called is recursive or not; understanding
what it does is the same.
However, you may be wondering how recursion works. Suppose in the body
of a function
factorial(n)
there is a call
factorial(n - 1)
. Evaluating
fac-
torial(n - 1)
requires executing the method body; how can the method body
be executed a second time before its first execution is finished?
The answer to this is simple. If you evaluate an initial call
factorial(3)
,
say, following
precisely
the steps presented in Sec. 2.7.2, you will see that those
steps work for recursive as well as non-recursive calls. Nothing new has to be
learned to handle recursion! Whenever a method is called, a new frame is creat-
ed and pushed on the call stack, and that frame is destroyed only when the call
completes. If there are 30 recursive, uncompleted calls to
factorial
, then the
call stack contains 30 frames for
factorial
.
Activity 15-2.1 shows evaluation of recursive calls, showing how the call
stack changes, in a way that we cannot match on paper. We urge you to watch it
now to gain full understanding. You will come to understand that the steps pre-
sented in Sec. 2.7.2 work for recursive as well as non-recursive calls.
The
depth of recursion
at any point of execution in a call of a recursive
method is the number of frames that are currently in use. Each of the frames takes
a certain amount of space, say
f
bytes of memory, and it also takes time to allo-
cate the space and to remove it. If the maximum depth of recursion during exe-
cution of a method call is
m
, then
m*f
bytes of memory are required during exe-
cution. For some applications, this space requirement may be a problem, and
people have been known to eschew recursion in favor of loops because of it.
Activity 15-2.1
shows execu-
tion of recursive
calls in a way
that we cannot
do here. Watch
that activity!
/**
Sort
b[h..k] */
public static void
mergesort(
int
[] b,
int
h,
int
k) {
if
(h >= k)
{
return
; }
int
e= (h + k) / 2;
mergesort(b, h, e); //
Sort
b[h..e]
mergesort(b, e + 1, k); //
Sort
b[e+1..k]
merge(b, h, e, k); //
Merge the two sorted segments
}
Figure 15.7:
Function
mergesort
Search WWH ::
Custom Search