...
Code Block |
---|
abstract class IntList { /** Computes a String representation of this list wiht matching parentheses * as in Scheme. For example, the list containing 1, 2 and 3 should return * (1, 2, 3) and the empty list should return (). * @return a non empty String consisting of elements in this list enclosed * in a pair of matching parenthesis, separated by commas. */ abstract String listString(); /** Accumulator helper method for listString to compute the String * required representation of this list given the accumulated * String representation of the preceding list. * @param acc the accumulated String representation of the list that * precedes this list. * @return a non empty String consisting of elements in this list enclosed * in a pair of matching parenthesis, separated by commas. */ abstract String listStringHelp(String acc); } class EmptyIntList extends IntList { /** @return "()"*/ String listString() { return "()"; } /** @param acc the accumulated String representation of the list that * precedes this list. For example "(5, 3" * @return a non empty String consisting of elements in this list enclosed * in a pair of matching parenthesis, separated by commas. For example, * "(5, 3)" */ String listStringHelp(String acc) { return acc + ")"; } } class ConsIntList extends IntList { int first; IntList rest; /** Calls on rest to perform the helper method listStringHelp passing it * the accumulated String representation so far, which is "(" + first. * @return a non empty String consisting of elements in this list enclosed * in a pair of matching parenthesis, separated by commas. */ String listString() { return rest.listStringHelp("(" + first); } /** @param acc the accumulated String representation of the list that * precedes this. For example "(5, 3" * @return a non empty String consisting of elements in this list enclosed * in a pair of matching parenthesis, separated by commas. For example, * "(5, 3)" */ String listStringHelp(String acc) { return rest.listStringHelp(acc + ", " + first); } } /** Testing empty lists. */ class TestEmptyIntList extends TestCase { void test_listString() { EmptyIntList mt = new EmptyIntList(); assertEquals(mt + ".listString()", "()", mt.listString()); } } |
Lab Exercises
...
- Write a method called
prodNums
that returns the product of the number in the list, using a tail recursive helper method. - Revise the preceding definition to terminate immediately if it encounters a 0 in the list of numbers being multiplied.
- Write a method called
makePalindrome
that returns a list consisting of the input list and its mirror around the last element, using a (non tail-recursive) helper with an accumulator. For example,(1, 2, 3).makePalindrome ()
returns thelist (1, 2, 3, 2, 1)
. - Write a method called
reverse
that reverses the list using a tail-recursive helper. - Come up with another version of
listString
. Call itlistString2
. How many different ways of writing this method can you come up with? Are some tail recursive and some not?