Z = 0 N = 2 dopóki Z < 3: N = N * 2 + 1 Z = Z + 1 wypisz N Która wartość zostanie wypisana przez algorytm?
Z = 0 N = 2 dopóki Z < 3: N = N * 2 + 1 Z = Z + 1 wypisz NKtóra wartość zostanie wypisana przez algorytm?
A. 5
B. 11
C. 23
D. 15
W tym algorytmie najważniejsze jest dokładne śledzenie wartości zmiennych po każdej iteracji pętli. Na początku mamy Z = 0 oraz N = 2. Pętla wykonuje się dopóki Z < 3, czyli dla wartości Z równych 0, 1 i 2. To daje dokładnie trzy obiegi pętli, nie cztery i nie dwa. W każdym obiegu najpierw zmieniana jest wartość N według instrukcji N = N * 2 + 1, a dopiero potem zwiększane jest Z o 1. Po pierwszym obiegu N = 2 * 2 + 1 = 5, Z = 1. Po drugim N = 5 * 2 + 1 = 11, Z = 2. Po trzecim N = 11 * 2 + 1 = 23, Z = 3. Warunek Z < 3 nie jest już spełniony, więc algorytm wypisuje 23. Moim zdaniem to jest bardzo dobry przykład na ćwiczenie tak zwanego śledzenia programu, czyli robienia tabelki wartości zmiennych. W praktyce przydaje się to przy debugowaniu kodu w JavaScript, PHP czy Pythonie, bo wiele błędów w aplikacjach wynika właśnie z pomylenia liczby wykonań pętli albo kolejności instrukcji. Dobra praktyka jest taka, żeby przy pętlach zawsze sprawdzać wartość startową licznika, warunek zakończenia oraz moment inkrementacji.
Jeżeli wynik wyszedł jako 5, 11 albo 15, to najpewniej problem polegał na zbyt szybkim przerwaniu analizy pętli albo na uproszczeniu działania instrukcji N = N * 2 + 1. Wartość 5 pojawia się po pierwszym wykonaniu pętli, więc taki wynik oznacza zwykle, że ktoś potraktował pętlę tak, jakby wykonała się tylko raz. Tymczasem zmienna Z startuje od 0 i po każdym obiegu rośnie o 1, więc warunek Z < 3 jest spełniony dla Z = 0, Z = 1 oraz Z = 2. Dopiero gdy Z osiągnie 3, pętla się zatrzymuje. Wynik 11 to stan po dwóch iteracjach, czyli też za wcześnie zatrzymany algorytm. To częsty błąd, szczególnie gdy ktoś myśli, że skoro w warunku jest liczba 3, to po dojściu do wartości 2 trzeba już skończyć. Nie, sprawdzamy warunek przed wejściem do pętli i wykonujemy blok tak długo, jak jest prawdziwy. Wartość 15 może wynikać z potraktowania działania jak zwykłego wielokrotnego podwajania albo z zastosowania nie tej zależności rekurencyjnej. Tutaj po każdym podwojeniu dochodzi jeszcze dodanie 1, i to dodanie dzieje się w każdej iteracji, nie tylko na końcu. Z mojego doświadczenia najlepiej rozpisać sobie małą tabelę z kolumnami Z i N. Taka metoda jest zgodna z dobrą praktyką analizy algorytmów: nie zgadujemy wyniku, tylko krok po kroku symulujemy wykonanie programu. W programowaniu webowym, na przykład przy licznikach w JavaScript albo przetwarzaniu danych w PHP, podobne pomyłki mogą powodować błędne wyniki formularzy, źle naliczone ceny albo niepoprawną liczbę wygenerowanych elementów na stronie.