Java Reference
In-Depth Information
PermutationGenerator . Just know that by “enumerating” the permutations of
w we mean returning them, one by one, as the result of calls to function next-
Element . Also, the rule must be followed that nextElement is called only if it is
guaranteed that another permutation of w exists to be enumerated.
Class PermutationGenerator is in Figs. 15.12. and 15.13.
Our basic idea for enumerating the permutations of a String like "xyz" is
first to enumerate the permutations that begin with x , then to enumerate the per-
mutations that begin with "y" , and then to enumerate the permutations that begin
with "z" . We will do this using the following fields.
Variable word contains the word whose permutations are being enumerated,
and hasAnother indicates whether all its permutations have been enumerated.
Variable pos contains the index of a character in word , and permutations
beginning with character word[pos] are being enumerated. Variable subWord
then contains the characters of word but with character word[pos] removed.
Thus, we are in the process of constructing and enumerating:
word[pos] + first permutation of subWord
word[pos] + second permutation of subWord
word[pos] + last permutation of subWord
How do we construct these permutations of subWord ? We use an instance of
PermutationGenerator , whose name is stored in field subEnum . This is the
recursively constructed object.
At this point, turn to the beginning of Fig. 15.12 and read carefully the class
invariant, which describes the relation among the fields of the class.
Now, one can look at the constructor and see that it truthifies the represen-
tation invariant. Also, function hasMoreElements is easily seen to be correct.
Function nextElement is more complicated. First, if word is the empty
string, it sets hasAnother to indicate that there are no more permutations and
returns the empty string. If word is not the empty string, it first stores the next
permutation in variable next —the permutation is the character word[pos] cate-
nated with the next permutation of subWord . It then calls a private procedure
getReadyForNext , which appears in Fig. 15.13. This procedure does what has
to be done to make the class invariant true after permutation next is returned.
Then, permutation next is returned. And that is it.
Generating permutations would be much harder if we did not use recursive
objects. With them, the task turns out to be relatively simple.
15.6
Key concepts
• Recursive definitions. Recursive definitions play an important role in mathe-
matics and fields that use mathematics.
• Recursion methods and recursive objects. In programming, recursion comes
 
Search WWH ::




Custom Search