Liczby Leonardo powstają poprzez wyliczanie kolejnych wyrazów ze wzoru rekurencyjnego. Dwa początkowe wyrazy to 1, 1, a każdy kolejny to suma dwóch poprzednich powiększona o 1. Wzór matematyczny wygląda następująco:
Liczby Leonardo tworzą następujący ciąg: 1, 1, 3, 5, 9, 15, 25, 41, 67, 109, ..
Jak można zauważyć ciąg Leonardo jest bardzo podobny do ciągu Fibonnaciego. Oznacza to, że kody do generowania obu ciągów będą bardzo podobne i różnić się będą jedynie powiększeniem sumy dwóch poprzednich wyrazów o 1. Podczas wyliczania wielu wyrazów ciągu należy pamiętać, że nie należy wyliczać każdego elementu oddzielnie, ponieważ rekurencja bardzo szybko zwiększa złożoność algorytmu!
Funkcja Leonardo() ma za zadanie wyliczyć n-ty wyraz ciągu. Oto przykładowa funkcja:
W funkcji dla n mniejszego, równego 2 zwracana jest wartość 1. Dla wyrazów o większym indeksie wyliczana jest w pętli wartość kolejnego wyrazu. Warto zauważyć, że podany algorytm iteracyjny wylicza żądany wyraz w czasie liniowym O(n).
Zastosowanie poprzednio napisanej funkcji Leonardo() w celu wypisania kolejnych k wyrazów ciągu Leonardo jest możliwe przy użyciu pętli, ale nie będzie to rozwiązanie efektywne rzędu O(n2). Warto jednak zauważyć, że poprzedni algorytm wyszukuje wszystkie liczby Leonardo, aż do n, więc można je pomiędzy kolejnymi obliczeniami zapisywać na listę:
Funkcja tablicaLeonardo() na początku deklaruje pustę liczb, którą następnie uzupełnia kolejno obliczonymi wartościami. Algorytm znajduje wszystkie liczby ma złożoność liniową O(n).
W celu przetestowania napisanych funkcji można skorzystać z poniższego fragmentu kodu: