|
Serwis Edukacyjny w I-LO w Tarnowie
Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej
Autor artykułu: mgr Jerzy Wałaszek |
©2026 mgr Jerzy Wałaszek
|
ProblemNależy obliczyć n-ty wyraz ciągu Fibonacciego. Leonardo Fibonacci był włoskim matematykiem żyjącym w latach od 1175 do 1250. Jest on autorem specyficznego ciągu liczbowego, który pojawia się w wielu zastosowaniach informatycznych (i nie tylko). Wyrazy ciągu Fibonacciego definiujemy rekurencyjnie w sposób następujący: F0 = 0 Oto kilka pierwszych wyrazów ciągu Fibonacciego: 0 1 1 2 3 5 8 13 21 34 55 89 … |
Rozwiązanie opieramy bezpośrednio na definicji wykorzystując wywołania
rekurencyjne. Jest to bardzo złe rozwiązanie (podajemy je
tylko ze względów dydaktycznych), ponieważ algorytm wielokrotnie oblicza
te same wyrazy ciągu, co w efekcie prowadzi do wykładniczej klasy złożoności
obliczeniowej
K01: Jeśli n ≤ 1, to zakończ z wynikiem n ; f0 lub f1 K02: Zakończ z wynikiem: Fibo(n-2)+Fibo(n-1) ; dwa wywołania rekurencyjne
|
Uwaga: Zanim uruchomisz program, przeczytaj wstęp do tego artykułu, w którym wyjaśniamy funkcje tych programów oraz sposób korzystania z nich. |
| W pierwszym wierszu program
odczytuje n – numer liczby Fibonacciego do wyliczenia. W
następnym wierszu program wypisuje wartość |
Pascal// Liczby Fibonacciego // Data: 20.04.2008 // (C)2020 mgr Jerzy Wałaszek //--------------------------- program fibnum; function fibo(n : integer) : longword; begin if n <= 1 then fibo := n else fibo := fibo(n-2)+fibo(n-1); end; var n : integer; begin readln(n); writeln(fibo(n)); writeln; end. |
// Liczby Fibonacciego
// Data: 20.04.2008
// (C)2020 mgr Jerzy Wałaszek
//---------------------------
#include <iostream>
using namespace std;
unsigned long fibo(int n)
{
if(n <= 1) return n;
else return fibo(n-2)+fibo(n-1);
}
int main()
{
int n;
cin >> n;
cout << fibo(n) << "\n\n";
return 0;
} |
Basic' Liczby Fibonacciego
' Data: 20.04.2008
' (C)2020 mgr Jerzy Wałaszek
'---------------------------
Function fibo(Byval n As Integer) _
As Ulongint
If n <= 1 Then _
fibo = n
Else
fibo = fibo(n-2)+fibo(n-1)
End If
End Function
Dim n As Integer
Open Cons For Input As #1
Input n
Close #1
Print fibo(n)
Print
End |
Python
(dodatek)# Liczby Fibonacciego
# Data: 18.02.2024
# (C)2024 mgr Jerzy Wałaszek
# --------------------------
def fibo(n):
if n <= 1:
return n
else:
return fibo(n-2)+fibo(n-1)
n = int(input())
print(fibo(n))
print()
|
| Wynik: |
25 75025 |
Poprzednie rozwiązanie jest bardzo proste. Niestety wywołania rekurencyjne
powodują, iż komputer wielokrotnie oblicza te same liczby Fibonacciego. W ramach
ćwiczeń proponuję dodać w wywołaniu funkcji
Drugie rozwiązanie wykorzystuje zasadę
programowania dynamicznego (ang. dynamic programming).
Polega ona na tym, iż rozwiązanie wyższego poziomu obliczamy z rozwiązań
otrzymanych na poziomie niższym, które odpowiednio zapamiętujemy. Dzięki temu
podejściu program nie musi liczyć wszystkich składników od początku,
wykorzystuje wyniki poprzednich obliczeń. W efekcie klasa złożoności
obliczeniowej algorytmu spadnie do
K01: f0 ← 0 ; pierwsza lub fi-2 liczba Fibonacciego K02: f1 ← 1 ; druga lub fi-1 liczba Fibonacciego K03: Dla i = 0, 1, …, n: wykonuj kroki K04…K08 K04: Jeśli i > 1, to idź do K06 K05: f ← i i następny obieg pętli K03 K06: f ← f0+f1 ; obliczamy kolejną liczbę Fibonacciego K07 f0 ← f1 ; zapamiętujemy wyniki obliczeń pośrednich K08: f1 ← f ; dla następnego obiegu pętli K09: Pisz f K10: Zakończ
|
Uwaga: Zanim uruchomisz program, przeczytaj wstęp do tego artykułu, w którym wyjaśniamy funkcje tych programów oraz sposób korzystania z nich. |
| Program odczytuje z pierwszego wiersza numer n liczby Fibonacciego, a w następnym wierszu wyświetla jej wartość. Z uwagi na ograniczony zakres liczb 64 bitowych, program wylicza dokładnie maksymalnie 93-cią liczbę ciągu Fibonacciego (w Pythonie nie ma takiego ograniczenia). |
Pascal// Liczby Fibonacciego
// Data: 21.04.2008
// (C)2020 mgr Jerzy Wałaszek
//---------------------------
program fibnum;
var f, f0, f1 : qword;
i, n : integer;
begin
f0 := 0;
f1 := 1;
readln(n);
for i := 0 to n do
if i > 1 then
begin
f := f0+f1;
f0 := f1;
f1 := f;
end
else f := i;
writeln(f);
end. |
// Liczby Fibonacciego
// Data: 21.04.2008
// (C)2020 mgr Jerzy Wałaszek
//---------------------------
#include <iostream>
using namespace std;
int main()
{
unsigned long long f, f0, f1;
int i, n;
f0 = 0;
f1 = 1;
cin >> n;
for(i = 0; i <= n; i++)
if(i > 1)
{
f = f0+f1;
f0 = f1;
f1 = f;
}
else f = i;
cout << f << endl;
return 0;
} |
Basic' Liczby Fibonacciego
' Data: 21.04.2008
' (C)2020 mgr Jerzy Wałaszek
'---------------------------
Dim As Ulongint f, f0, f1
Dim As Integer i, n
f0 = 0
f1 = 1
Input n
For i = 0 To n
If i > 1 Then
f = f0+f1
f0 = f1
f1 = f
Else
f = i
End If
Next
Print f
End |
Python
(dodatek)# Liczby Fibonacciego
# Data: 18.02.2024
# (C)2020 mgr Jerzy Wałaszek
# --------------------------
f0, f1, f = 0, 1, 1
n = int(input())
for i in range(n+1):
if i > 1:
f = f0+f1
f0 = f1
f1 = f
else:
f = i
print(f)
|
| Wynik: |
93 12200160415121876738 |
| Wyniki (tylko Python): |
100 354224848179261915075 150 9969216677189303386214405760200 200 280571172992510140037611932413038677189525 |
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2026 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.