Ciąg Recamána to ciąg liczb naturalnych, którego pierwszy wyraz to 0. Każdy następny wyraz jest określony rekurencyjnie. Jeśli wyliczona wartość w = an - 1 - n jest dodatnia i nie jest wartość żadnego poprzedniego wyrazu ciągu to ustal jako an. W przeciwnym razie ustal an = an - 1 + n. Ciąg Recamána to ciąg, który można opisać słowami "odejmij jeśli możesz, w przeciwnym razie dodaj".
Ciąg Recamána to kolejno: 0, 1, 3, 6, 2, 7, 13, 20, 12, 21, ..
w celu optymalizacji kodu generującego kod funkcja tworzy nową dynamiczną tablicę liczb, która będzie przechowywać wyniki cząstkowe. W ten sposób zostanie zaoszczędzona moc obliczeniowa. Gdyby każdy wyraz wyliczać oddzielnie to złożność czasowa byłaby O(n2), ponieważ do wyliczenia n-tego wyrazu należałoby wyliczyć wszystkie n - 1 poprzednich wyrazów.
Poniższy kod generuje listę zawierającą k pierwszych wyrazów ciągu Recamána.
(2.) Alokacja tablicy i (3.) przypisanie pierwszego wyrazu ciągu. (4.) Dla każdego kolejnego wyrazu: (5.) wylicz wartość w. (6.) Jeśli dana wartość jest dodatnia i nie występowała wcześniej w wyliczonych wyrazach to (7.) przypisz wyliczoną wartość, a w przeciwnym razie (9.) ustal na wartość poprzedni wyraz + i. Na koniec (12.) zwróć wskaźnik na listę.
W celu sprawdzenia czy dana wartość nie występuje już w tablicy została dopisana specjalna funkcja wystepuje(), która w podanej liście lista o długości n sprawdza czy występuje wartość a.
Jeśli dana wartość występuje to (4.) zwracana jest prawda, a w przeciwnym wypadku (5.) wartość 5.
Poniższa funkcja main() demonstruje jak wypisać pierwsze 20 wyrazów przy pomocy napisanej funkcji:
Napisz przeciążenie funkcji int* ciagRecamana(int k, int p), gdzie parametr p będzie określał wartość pierwszego wyrazu ciągu.
Przykładowo dla k = 10 oraz p = 3 program wypisze* ciąg:
* sposób wypisania pozostaje dowolny
Napisz funkcje int podajIndeks(int a), która zwróci na której pozycji występuje wskazana wartość a w ciągu Recamána. Dopisz przeciążenie funkcji int podajIndeks(int a, int p), która będzie szukać wyrazu a w ciągu utworzonym na zasadach z zadania 1.
Przykładowo dla a = 7 program zwróci:
Z kolei dla a = 7 i p = 3 poprawny wynik to: