Ile kolejnych liczb wygenerować?    

Algorytm arytmetyczny kodowany w Perlu

Courtesy of Wikipedia Generuj $n liczb Fibonacciego:
####################################
for ($i=0; $i<$n; $i++)
{
     # Wzór Eulera-Bineta
     $fibonacci = (1/sqrt(5))*((1 + sqrt(5))/2)**$i
     - (1/sqrt(5))*((1 - sqrt(5))/2)**$i;

     # Zaokrąglenie do liczby całkowitej
     $fibonacci = int($fibonacci + 0.5);

     print "$fibonacci\n";
}
####################################

Wzór Eulera-Bineta

Courtesy of Wikipedia




Algorytm arytmetyczny korzystający ze wzoru Eulera-Bineta jest w stanie wygenerować ciąg 1475 liczb Fibonacciego (wliczając zero) przy czym największa liczba ciągu wynosi 4,99225460547801 x 10307, co stanowi pewne ograniczenie w porównaniu do 1477 liczb Fibonacciego generowanych metodą iteracyjną.

Na podkreślenie zasługuje fakt, że algorytm arytmetyczny generujący ciąg Fibonacciego jest bardzo szybki i efektywny w porównaniu z metodą rekurencyjną.

W moich testach wydajności polegających na generowaniu 1475 liczb Fibonacciego w cyklach powtarzanych milion razy (bez przerw pomiędzy cyklami), algorytm arytmetyczny okazał się ok. 1,5 raza wolniejszy niż iteracyjny.

Kolejnym problemem jest nieco wątpliwa dokładność algorytmu arytmetycznego związana z koniecznością zaokrąglania liczb będących wynikiem wielokrotnego potegowania liczb niewymiernych (pierwiastek z pięciu).

Zachęcam niniejszym do testowania algorytmu arytmetycznego! Proponuję spróbować wygenerować przy jego pomocy 1476 liczb Fibonacciego a następnie porównać wynik z uzyskanym metodą iteracyjną (bardzo pouczające). laughing