R7L2RZA2MV5A1
Zdjęcie przedstawia słonecznik.

I_R_W14_M09_Java Ciąg Fibonnaciego

Źródło: Jason Leung, domena publiczna.

Ciąg Fibonnaciego - wersja iteracyjna

Wersja iteracyjna ciągu Fibonacciego polega na obliczaniu kolejnych wyrazów bez użycia rekurencji, co czyni ją bardziej wydajną pod względem czasu i pamięci. Zamiast wielokrotnie wywoływać tę samą funkcję, wykorzystujemy pętlę (np. for lub while) oraz zmienne pomocnicze do przechowywania dwóch ostatnich wartości ciągu. Dzięki temu każde kolejne obliczenie opiera się bezpośrednio na poprzednich wynikach, co znacząco redukuje złożoność obliczeniową do liniowej O(n).

Napiszemy program, który zwróci element ciągu Fibonacciego o indeksie n. Zastosujemy iterację.Sprubuj rozwiązać zadanie samodzielnie, jeżeli popełnisz błąd zapoznaj się z dalszą częścią materiału.

1
Ćwiczenie 1

Napisz program, który wyznaczy n‑ty wyraz ciągu Fibonnaciego.

Specyfikacja problemu:

Dane:

  • n – liczba naturalna

Wynik:

  • n‑ty element ciągu Fibonnaciego

R1LHHTDP1CDV5

Rozpocznijmy od utworzenia metody o nazwie iterFibonacci.

Linia 1. public static long iterFibonacci otwórz nawias okrągły int n zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. zamknij nawias klamrowy.

Wybieramy typ long, ponieważ wartości kolejnych wyrazów ciągu Fibonacciego rosną wykładniczo.

Parametr n funkcji będzie indeksem elementu ciągu, który ma być obliczony.

Zapisujemy warunki, po których spełnieniu zostanie zatrzymane działanie funkcji i zwróci ona wartość. Wiemy, że pierwszy wyraz ciągu Fibonacciego – zatem wyraz o indeksie 0 – ma wartość 0. Natomiast drugi wyraz – czyli wyraz o indeksie 1 – wynosi 1. Zapiszemy odpowiednie instrukcje warunkowe.

Linia 1. public static long iterFibonacci otwórz nawias okrągły int n zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. if otwórz nawias okrągły n znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. return 0 średnik. Linia 4. zamknij nawias klamrowy else if otwórz nawias okrągły n znak równości znak równości 1 zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. return 1 średnik. Linia 6. zamknij nawias klamrowy. Linia 7. zamknij nawias klamrowy.

Musimy brać również pod uwagę przypadek, gdy wartość parametru n jest większa niż 1. W takiej sytuacji każdy kolejny element jest sumą dwóch poprzednich. Dla dalszego działania funkcji potrzebujemy zmiennych pomocniczych. Inicjalizujemy trzy zmienne pomocnicze: a, b (oznaczające wartości dwóch początkowych wyrazów ciągu) oraz i (indeks kolejnego elementu ciągu Fibonacciego). Przypisujemy im odpowiednio wartości 0, 1 i 2.

Linia 1. public static long iterFibonacci otwórz nawias okrągły int n zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. if otwórz nawias okrągły n znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. return 0 średnik. Linia 4. zamknij nawias klamrowy else if otwórz nawias okrągły n znak równości znak równości 1 zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. return 1 średnik. Linia 6. zamknij nawias klamrowy. Linia 8. long a znak równości 0 średnik. Linia 9. long b znak równości 1 średnik. Linia 10. int i znak równości 2 średnik. Linia 12. zamknij nawias klamrowy.

Zapisujemy pętlę while, która będzie wykonywać się tak długo, dopóki wartość zmiennej i jest mniejsza od wartości zmiennej n lub jej równa.

Linia 1. public static long iterFibonacci otwórz nawias okrągły int n zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. if otwórz nawias okrągły n znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. return 0 średnik. Linia 4. zamknij nawias klamrowy else if otwórz nawias okrągły n znak równości znak równości 1 zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. return 1 średnik. Linia 6. zamknij nawias klamrowy. Linia 8. long a znak równości 0 średnik. Linia 9. long b znak równości 1 średnik. Linia 10. int i znak równości 2 średnik. Linia 12. while otwórz nawias okrągły i otwórz nawias ostrokątny znak równości n zamknij nawias okrągły otwórz nawias klamrowy. Linia 13. otwórz nawias ostrokątny code style znak równości cudzysłów white minus space dwukropek pre średnik cudzysłów data minus inline zamknij nawias ostrokątny zamknij nawias klamrowy otwórz nawias ostrokątny prawy ukośnik code zamknij nawias ostrokątny. Linia 15. zamknij nawias klamrowy.

W każdym obiegu pętli while najpierw obliczamy i-ty wyraz ciągu, czyli sumę dwóch poprzednich wyrazów ciągu. Wynik przypisujemy do zmiennej suma. Następnie zmiennej a przypisujemy wartość zmiennej b, a zmiennej b wartość zmiennej suma. Na końcu zwiększamy wartość zmiennej i o 1.

Linia 1. public static long iterFibonacci otwórz nawias okrągły int n zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. if otwórz nawias okrągły n znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. return 0 średnik. Linia 4. zamknij nawias klamrowy else if otwórz nawias okrągły n znak równości znak równości 1 zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. return 1 średnik. Linia 6. zamknij nawias klamrowy. Linia 8. long a znak równości 0 średnik. Linia 9. long b znak równości 1 średnik. Linia 10. int i znak równości 2 średnik. Linia 12. while otwórz nawias okrągły i otwórz nawias ostrokątny znak równości n zamknij nawias okrągły otwórz nawias klamrowy. Linia 13. long suma znak równości a plus b średnik. Linia 14. a znak równości b średnik. Linia 15. b znak równości suma średnik. Linia 16. i znak równości i plus 1 średnik. Linia 17. otwórz nawias ostrokątny code style znak równości cudzysłów white minus space dwukropek pre średnik cudzysłów data minus inline zamknij nawias ostrokątny zamknij nawias klamrowy otwórz nawias ostrokątny prawy ukośnik code zamknij nawias ostrokątny. Linia 19. zamknij nawias klamrowy.

Po zakończeniu pętli wartość zmiennej jest zwracana jako wynik działania funkcji.

Linia 1. public static long iterFibonacci otwórz nawias okrągły int n zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. if otwórz nawias okrągły n znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. return 0 średnik. Linia 4. zamknij nawias klamrowy else if otwórz nawias okrągły n znak równości znak równości 1 zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. return 1 średnik. Linia 6. zamknij nawias klamrowy. Linia 8. long a znak równości 0 średnik. Linia 9. long b znak równości 1 średnik. Linia 10. int i znak równości 2 średnik. Linia 12. while otwórz nawias okrągły i otwórz nawias ostrokątny znak równości n zamknij nawias okrągły otwórz nawias klamrowy. Linia 13. long suma znak równości a plus b średnik. Linia 14. a znak równości b średnik. Linia 15. b znak równości suma średnik. Linia 16. i znak równości i plus 1 średnik. Linia 17. otwórz nawias ostrokątny code style znak równości cudzysłów white minus space dwukropek pre średnik cudzysłów data minus inline zamknij nawias ostrokątny zamknij nawias klamrowy otwórz nawias ostrokątny prawy ukośnik code zamknij nawias ostrokątny. Linia 19. return b średnik. Linia 21. zamknij nawias klamrowy.