Artur 55 wyśw. 02-07-2025 21:21

Praca domowa 2 zad 16

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ą?


Programowanie Dodaj post do ulubionych Poproś o pomoc
s.gugula 02-07-2025 21:52

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 :)



Artur 03-07-2025 10:55

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


s.gugula 03-07-2025 13:13

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.


Artur 03-07-2025 13:55

To jeśli nie ma z góry narzuconej numeracji to dlaczego nie można zacząć od jakiegokolwiek numeru?


s.gugula 04-07-2025 10:47

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ć ;)


Artur 04-07-2025 12:54

Dziękuję :)


Zadzwoń teraz Dotknij, aby się ze mną skontaktować.