Lab: Hailstone Series


The Problem

A Hailstone series is defined as follows: start with any integer value greater than 0, say x. If x is even, then the next value in the series is x/2; if x is odd, then the next value in the series is 3x + 1. Now apply the same rules to create the next value in the series, and so on. The name Hailstone comes from the property that the values in such a series alternate between going up and down (up for odd values and down for even values.)

For instance, here is the Hailstone series generated from starting value 17:

17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1

Note that if a Hailstone series ever reaches the value 1, then the next value generated is 4, the next is 2, and the next is 1 again. Thus, when a Hailstone series reaches 1, then it has converged in the sense that the rest of the series is 4, 2, 1, 4, 2, 1, ... .

The Hailstone series is the subject of a long-standing mathematical open question: given an arbitrary positive integer as a starting value, will the resulting Hailstone series converge as just described? For all positive integers of size at most 1.2x1012, it is known that the series does converge. To date, however, there is no formal proof that all such series must converge. (There is an interesting and readable article about the Hailstone series in the January 1984 issue of Scientific American .)

For this assignment, you will write a program that allows users to enter a starting value from which the program computes and outputs the corresponding Hailstone series (stopping with 1 if it ever reaches 1). After the initial program works, there are a number of other requirements to change it slightly, one step at a time, as explained below.

Setup

Follow these steps to set up a project for this lab.

  1. Create a new Eclipse project by copying ProjectTemplate (if needed, see Creating a New Project from a Project Template for details). Name the new project Hailstone.
  2. Open the src folder of this project and then open (default package). As a starting point you should use ProgramWithIOAndStaticMethod.java. Rename it Hailstone1 and delete the other files from the project (if needed, see Creating a Program from a Skeleton (also Renaming a Java Program) for details).

Method

  1. Edit Hailstone1.java (including updating comments appropriately) to ask the user for a positive integer and then compute and output the corresponding Hailstone series. The generation and output of the series should be done in a static method declared as follows (copy the method header, including the documentation comment, from the browser and paste it into Eclipse, replacing only the myMethod method provided in the skeleton program):
  2. Copy Hailstone1.java to create Hailstone2.java (right-click on Hailstone1.java to get the contextual pop-up menu and choose Copy, then right-click on (default package) and choose Paste, providing the new name Hailstone2). Change generateSeries (including its Javadoc comments) so that it also computes and outputs the length of the series.
  3. Copy Hailstone2.java to create Hailstone3.java. Change generateSeries (including its Javadoc comments) so that it also computes and outputs the maximum value of the series.
  4. Copy Hailstone3.java to create Hailstone4.java. Change it so that it repeatedly asks the user whether they wish to calculate another series. If the response is "y", then the program should proceed; if it is anything else, then the program should quit.

Additional Activities

  1. Copy Hailstone4.java to create Hailstone5.java. Change it so that it checks that the input provided by the user is a positive integer. You should implement a new static method declared as follows: Note that you cannot assume the user will provide a number; the user can type pretty much anything. So your method should read the input as a String (use SimpleReader's nextLine()), then make sure that the input is an integer number (use FormatChecker.canParseInt()), then convert the string to an integer (use Integer.parseInt()), and finally check that the integer is positive.