Ciąg Collatza (znany też jako „hailstone sequence” lub ciąg Ulama) to ciąg liczb naturalnych rozpoczynający się od dowolnej liczby a0, którego kolejne wyrazy obliczane są według zasady
Istnieje hipoteza, że taki ciąg zawsze dojdzie do
liczby 1 (i potem będzie już periodyczny:
1,4,2,1,4,2,1,4,...). Została ona sprawdzona
aż do astronomicznie wielkich liczb, ale do tej pory nie
udało się jej udowodnić.
Na przykład, jeśli rozpoczniemy od liczby 5, otrzymamy
ciąg [5,16,8,4,2,1,...], a rozpoczynając
od 7 otrzymamy już ciąg dłuższy:
[7,22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1,...].
Zadanie polega na stworzeniu klasy
Hailstone, której obiekty reprezentują
pojedynczy ciąg Collatza. Konstruktor pobiera liczbę startową
(a0), o której można założyć, że zawsze
będzie większa od 1. Sam obiekt jest iterowalny, czyli
implementuje interfejs Iterable
i w każdej iteracji zwraca kolejne elementy ciągu,
poczynając od wartości startowej. Iteracja powinna kończyć się
po zwróceniu, jako ostatniego elementu, liczby 1.
Implementacja klasy Hailstone
Utworzoną klasę przetestuj za pomocą następującego programu:
public class Main {
public static void main(String... args) {
int ini = 77031, count = -1, maxel = 0;
Hailstone hailstone = new Hailstone(ini);
for (int h : hailstone) {
if (h > maxel) maxel = h;
++count;
}
System.out.println(ini + " " + count + " " + maxel);
}
}
Powinien on wypisać, w jednej linii, oddzielone spacjami,
trzy liczby: wartość startową (ini;
w tym przykładzie 77031), ilość kroków wykonanych
do osiągnięcia jedynki (count),
oraz największy wyraz tego ciągu (maxel).
Na przykład dla wartości startowej 10, ciąg, aż do uzyskania
jedynki, zawierałby elementy [10 5 16 8 4 2 1],
a zatem trzy liczby, które wtedy wypisałby program miałyby
wartości 10 6 16.