niestety, ale chyba nie rozumiem. może to nie dla mnie
@KomnatoMan:
Ktoś kiedyś powiedział "aby pojąć rekurencję musisz pojąć rekurencję".
A teraz do rzeczy:
Zakładam, ze wiesz jak działa ciąg Fibonacciego.
def fibr(n):
if n < 1:
return 0
if n < 2:
return 1
return fibr(n - 1) + fibr(n - 2)
Do return 1 chyba wszystko jasne. Wywołujesz fibr(0), zwracane jest 0, wywołujesz fibr(1), zwracane jest 1. Przy tym nie jest to zerowy lub pierwszy wyraz ciągu, ale liczba stojąca pod takim indeksem w tablicy elementów tego ciągu. (Mam nadzieję, że bardziej nie zamotałem).
"Schody" pojawiają się, gdy zechcemy wywołać funkcję fibr() z parametrem większym od 1. Niech już będzie te 5.
n = 5
5<1 - fałsz, kod się nie wykona
5<2 - fałsz, kod się nie wykona
pozostaje ostatnia linijka
fibr(5-1) + fibr(5-2), czyli fibr(4) + fibr(3)
Dostaliśmy 3 i 4, obie są większe od 1, zatem nadal zwracana jest ostatnia linijka, ale teraz mamy takie coś (użyję nawiasów kwadratowych dla zwiększenia czytelności):
[fibr(4-1) + fibr(4-2)] + [fibr(3-1) + fibr(3-2)], czyli [fibr(3) + fibr(2)] + [fibr(2) + fibr(1)]
z 5 zrobiło się 3, dwie 2 i 1
1<2 - prawda, więc zwrócone zostanie 1
dla 3 i obu 2 ponownie zostanie wykonana ostatnia linijka. Uzyskamy:
[fibr(3-1) +fibr(3-2)] + [fibr(2-1) + fibr(2-2)] + [fibr(2-1) + fibr(2-2)] + 1
czyli
[fibr(2) + fibr(1)] + [fibr(1) +fibr(0)] + [fibr(1) +fibr(0)] + 1
Dla 0 i 1 funkcja zwraca konkretną wartość.
0<1, więc dostajemy 0
1<2, więc dostajemy 1
Dla ostatniej 2 wykona się ponownie ostatnia linijka.
Uzyskamy
fibr(2-1) + fibr(2-2) + 1 +1 + 0 + 1 + 0 + 1
co jest równe
fibr(1) + fibr(0) + 1 +1 + 0 + 1 + 0 + 1
czyli
1 + 0 + 1 +1 + 0 + 1 + 0 + 1
a to będzie
5
Innymi słowy (najlepiej to chyba wyjdzie na rysunku):
fibr(5) = fibr(4) + fibr(3) = fibr(3) + fibr(2) + fibr(2) + fibr(1) = fibr(2) + fibr(1) +fibr(1) + fibr(0) +fibr(1) + fibr(0) + fibr(1) = fibr(1) + fibr(0) + fibr(1) +fibr(1) + fibr(0) +fibr(1) + fibr(0) + fibr(1)
Tak przy okazji - podany kod można zapisać w taki sposób:
def fibr(n):
if n>1:
return fibr(n-1) + fibr(n-2)
return n
Wówczas sprawdzany jest tylko jeden warunek.