https://en.wikipedia.org/wiki/Fibonacci_number
Výpočet môžeme urobiť priamočiaro pomocou rekurzie.
def fib(i):
if i <= 1:
return i
return fib(i-1)+fib(i-2)
fib(20)
Zložitosť je exponenciálna, O(2^n), resp. O(fi^n), kde fi je zlaty rez (sqrt(5)+1)/2
V strome volaní sa výpočty opakujú - môžeme si pamätať priebežné medzivýsledky (v pomocnom poli) - MEMOIZÁCIA
n = 50
F = [-1]*(n+1) #vytvorime 41-prkove pole, vyplnime -1 (este nepocitane)
F[0] = 0
F[1] = 1
def fib2(i):
if F[i] == -1: #ak sme ho este nepocitali
F[i] = fib2(i-1)+fib2(i-2)
return F[i] #vratime zapametanu hodnotu
fib2(n)
Dynamické programovanie (zdola nahor) vypočíta (a zapamätá) postupne všetky medzivýsledky od najmensších hodnot
n = 200
F = [-1]*(n+1) #vytvorime 41-prkove pole, vyplnime -1 (este nepocitane)
F[0] = 0
F[1] = 1
for i in range(2, n+1): #od 2 po n
F[i] = F[i-1]+F[i-2] #predchadzajuce hodnoty uz si vypocitane
print(F[n])
Dá sa vyriešiť aj bez pomocného poľa, teda v konštantnej pamäťovej zložitosti. Stačí si pamätať posledné 2 čísla.
n = 50
a, b = 0, 1 #priradenie dvojice; a = 0 a b = 1
for i in range(n):
a, b = b, a+b #Python najprv vypocita pravu stranu a potom priradi
print(a)