16. Napisz program, w którym zdefiniowana jest początkowo jedna zmienna typu całkowitego n
(niezbyt wysoka). Program ma wyświetlić na ekranie n początkowych wyrazów ciągu Fibonacciego i
obliczyć ich średnią arytmetyczną. Ciąg Fibonacciego jest ciągiem liczb naturalnych określonym w
następujący sposób: pierwszy wyraz to 0, drugi to 1, każdy kolejny jest sumą dwóch poprzednich.
Zatem kilka początkowych wyrazów ciągu jest następujących: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
Przykładowy wynik działania programu:
Liczba wyrazów do wyświetlenia: 13
Kolejne wyrazy ciągu Fibonacciego: 0 1 1 2 3 5 8 13 21 34 55 89 144
int liczba=13;
int wyr1=0, wyr2=1;// Zmienne oznaczające dwa poprzednie wyrazy
int wyrazAktualny; // Zmienna oznaczająca aktualny wyraz
System.out.println("Liczba wyrazow do wyswietlenia: "+liczba);
System.out.print("Kolejne wyrazy ciagu Fibonacciego: "+wyr1+" "+wyr2+" ");
int suma=1; // wyr1+wyr2=0+1=1;
for(int i=3; i <= liczba; i++)
{
wyrazAktualny=wyr1+wyr2;
System.out.print(wyrazAktualny+" ");
suma+=wyrazAktualny;
wyr1=wyr2;
wyr2=wyrazAktualny;
}
System.out.println("Srednia arytmetyczna pierwszych "+liczba+" wyrazow ciagu Fibonacciego wynosi: "+(double)suma/liczba);
1 - Nie rozumiem dlaczego należy przypisać wyr1=wyr2 i wyr2=wyrazAktualny (a nie wyr2=wyr1 i wyrazAktualny=wyr2) oraz dlaczego fora zaczynamy od i=3.
2 - Pytanie ogólne: czy w Javie tak jak w c++ liczy się od 0 czy od 1?
3 - Czy dobrze "ulepszyłem" ten kod tak, aby liczył średnią arytmetyczną?
2 - właśnie nie wiem czy dobrze to pamiętam z C++, ale w takiej pętli for jak powyżej jeśli chodziło o 3 wyraz to wtedy chyba zaczynałoby się od i=2
2 - gdyby to były wyrazy jakiejś np. tablicy, to w istocie należałoby zacząć od indeksu nr 2. Natomiast tu nie mamy żadnej tablicy, mamy tylko jakieś wyrażenia obliczane poprzez użycie zmiennej i, ale nie są one "wrzucone" do żadnej struktury danych, więc nie ma tu z góry narzuconej numeracji.
To jeśli nie ma z góry narzuconej numeracji to dlaczego nie można zacząć od jakiegokolwiek numeru?
Można. Tylko wtedy warunek zakończenia pętli też musisz zmodyfikować, żeby wykonała się odpowiednia liczba obiegów pętli. I wtedy on będzie zapewne wyglądał dość nienaturalnie. No ale można tak zrobić ;)
1 - bo wyr1 jest wyrazem wcześniejszym (bardziej z "lewej"), a wyr2 kolejnym (z "prawej"). Więc teraz przeskakując z naszym ciągiem w prawo element wyr2 staje się elementem wyr1, więc wyr1 = wyr2. No a wyraz aktualny staje się wyrazem wyr2, stąd wyr2 = wyrazAktualny. Fora zaczynamy od i = 3, bo pierwsze dwa wyrazy ciągu mamy już zdefiniowane jako 0 i 1, więc nimi nie ma się już co zajmować, tylko zaczynamy od następującego po nich, czyli trzeciego.
2 - to jest trochę zbyt ogólne, bo to zależy co masz na myśli mówiąc "liczy się" - liczyć sobie można od dowolnej wartości. Ale przypuszczalnie chodzi Ci np. o numerowanie elementów w różnego rodzaju kolekcjach, np. tablicach (o nich na 3. zajęciach będziemy mówili), więc tu odpowiedź brzmi tak - pierwszy element tablicy jest oznaczony indeksem 0, drugi 1 itd., tak jak w C++ (i zapewne większości języków).
3 - tak, wygląda ok :)