Liczby Sześciokątne to liczby naturalne, które opisują schemat złożony z coraz większych sześciokątów. Wyraz można obliczyć ze wzoru Hn = 3n(n - 1) + 1 co odpowiada sumowaniu wszystkich wierzchołków sześciokątów oddzielnie. Poniżej została przedstawiona graficzna ilustracja liczb Hn:
Jak można zauważyć na ilustracjach w n-tym schemacie będzie n sześciokątów i każdy kolejny jest "większy" o sześć wierzchołków od poprzedniego.
Liczby można ustawić w następujący ciąg: 1, 7, 19, 37, 61, 91, 127, 169, 217, 271, 331, 397, ..
Napisz funkcję liczbaSzesciokatna(), która dla podanego argumentu n zwróci liczbę sześciokątną Hn. Przyjmujemy, że H0 = 1 itd. Przetestuj działanie funkcji.
Podstawowa wersja kodu polega na napisaniu funkcji, która będzie obliczać ile ma i-ty sześciokąt i doda jego liczbę wierzchołków do ogólnej sumy. W celu zwiększenia wydajności liczba wierzchołków następnego sześciokąta jest wyliczana na podstawie liczby wierzchołków poprzedniego poprzez dodanie 6. Algorytm ten ma złożoność liniową O(n) i kod wygląda następująco:
(2.) Początkowo suma to 1 (dla pierwszego wyrazu) oraz (3.) liczba wierzchołków w największym sześciokącie to 0. Następnie (4.) W pętli: (5.) wylicz ile wierzchołków ma aktualna figura i (6.) dodaj do sumy. Na koniec (7.) zwróć zsumowaną liczbę wierzchołków.
Jednak dla takich przypadków obliczania możliwe jest uzyskanie wzoru. Wtedy algorytm działania nie liniowo O(n), a w czasie stałym O(1). Poniżej zostaje przedstawiona funkcja, która oblicza żądany wyraz prosto ze wzoru.
W celu przetestowania działania napisanej funkcji można skorzystać z poniższego fragmentu kodu:
Zauważmy, że w każdym kolejnym schemacie sześciokątów jest dokładnie o 6n wierzchołków więcej. Oznacza to, że liczbę Sześciokątną można wyliczyć poprzez sumowanie liczb od 1 do n (dla n = 0 suma wynosi 0), pomnożeniu przez 6 i dodaniu jeden. Przykładowo w celu wyliczenia H3 = 6·(1 + 2 + 3) + 1 = 37.
Napisz funkcję liczbaSzesciokatna(), która dla podanego argumentu n i przedstawionego rozumowania zwróci n-tą liczbę sześciokątną.