FIBONACCIHO ČÍSLA
Posloupnost 0,1,1,2,3,5,8,13,21,34,..., ve které je každý člen sumou předcházejících dvou členů, objevil v roce 1202 italský matematik Leonardo Pisano (Leonardo z Pisy), kterého nazývali také Leonardo Fibonacci (Filius Bonacci, tj. syn Bonacciův). Fibonacciho čísla jsou definována vztahem:
F0=0;F1=1;...;FN=FN-1+FN-2 pro N>=2
Nejprve uvedu efektivní algoritmus (viz Technika: Odstranění rekurze) pro nalezení N-tého Fibonacciho čísla.
FIB: procedure
parse arg N
if N = 0 | N = 1 then return N
A = 0; B = 1
do N - 1
parse value(B (B + A)) with A B
end
return B
|
Nejhorší případ při výpočtu největšího společného dělitele pomocí Euklidova algoritmu nastane, když parametry A a B jsou dvě po sobě následující Fibonacciho čísla. Pro testování této vlastnosti je výhodné upravit funkci FIB tak, aby vracela právě ony dvě po sobě následující Fibonacciho čísla. Toho dosáhneme jednoduchou úpravou posledního příkazu na return B A. Volání funkce FIB(N) bude vracet N-té a ( N-1)-ní Fibonacciho číslo.
V 9. kapitole své knihy Systematisches Programmieren (slovenský překlad Systematické programovanie, Alfa Bratislava, 1981) uvádí N. Wirth vzorec pro explicitní vyjádření N-tého Fibonacciho čísla. Použijeme jej ve funkci GENERAL_FIB.
GENERAL_FIB: procedure
parse arg N, P
if N = 1 then return 1
Sqrt5 = SQRT(5, P); C = (1 + Sqrt5) / 2
return FORMAT(C ** N / Sqrt5,,0)
|
Program FIB počítá N-té Fibonacciho číslo, pro
N=10000 a P=2100 celkem 8.34 sekund, zatímco program GENERAL_FIB potřebuje 63.39 sekund. Je zajímavé, že příliš nepomůže ani předvypočítat hodnotu SQRT(5,2100) a vytvořit funkci SQRT5 vracející jen tuto hodnotu. GENERAL_FIB počítá 26.47 sekund.
SOUVISLOSTI
|