Wzorzec inkrementalny

W poprzednim przykładzie napisaliśmy funkcję, która oblicza kwadrat liczby. Algorytm, jaki użyliśmy był bardzo prosty: pomnóż liczbę przez samą siebie. W tym rozdziale ponownie zaimplementujemy funkcję square, ale użyjemy nieco inny algorytm, taki, który bazuje na dodawaniu, a nie na mnożeniu.

Jeżeli chcemy pomnożyć przez siebie dwie liczby, to w najprostszym podejściem będzie zauważenie, że jest to po prostu proces dodawania do siebie pierwszej liczby odpowiednią ilość razy. Za ilość tych powtórzeń odpowiada właśnie druga liczba. Na przykład, jeżeli chcemy pomnożyć liczbę trzy i pięć, wystarczy, że pięciokrotnie dodamy do siebie liczbę trzy. Trzy plus trzy to sześć, plus trzy to już dziewięć, plus trzy daje 12 i w końcu plus trzy to 15. Uogólniając ten przykład, jeżeli chcemy zaimplementować w ten sposób podnoszenie do kwadratu liczby n, dodalibyśmy do siebie liczbę n dokładnie n razy.

Najpierw wykonaj wspomniane obliczenia samodzielnie na kartce papieru. Zobaczysz, że w jakiś sposób będziesz musiał przechowywać informację o „wyniku tymczasowym” sumy – na kartce albo w pamięci. Takie zapamiętywanie rzeczy w każdym kroku algorytmu to właśnie esencja programowania z użyciem zmiennych. Oznacza to, że będziemy potrzebować jakiejś zmiennej, aby przetrzymywać ów „wynik tymczasowy”. Powinien być on inicjalizowany z wartością zero. Następnie będziemy musieli aktualizować wartość tego „wyniku tymczasowego” odpowiednią ilość razy. Przy każdym powtórzeniu zaktualizujemy tymczasową sumę poprzez dodawanie liczby do wartości naszej zmiennej.

Można to też ująć w następujący sposób. Aby podnieść do kwadratu wartość zmiennej n, będziemy powtarzać proces aktualizacji sumy tymczasowej n razy. Aby zaktualizować wartość tymczasowej sumy, weźmiemy jej obecną wartość i dodamy do niej wartość trzymaną przez n. Ta właśnie obliczona suma to będzie nowa wartość zmiennej odpowiadającej za sumę tymczasową.

Poniżej w activecode znajdziecie program. Zauważmy, że definicja funkcji jest taka sama jak wcześniej. Jedyne co się zmienia to sposób w jaki obliczamy kwadrat liczby. Jest to doskonały przykład na konstrukcję „czarnej skrzynki”. Możemy zmienić detale w środku skrzynki, a wciąż możemy używać funkcji dokładnie tak jak wcześniej.




(sq_accum1)

W powyższym programie zwróć uwagę na to, że zmienna runningtotal inicjalizowana jest z wartością 0. Następnie iteracja przeprowadzona jest x razy. Aktualizacja następuje w środku pętli for. Do zmiennej runningtotal przypisywana jest za każdym obrotem pętli nowa wartość, która jest sumą poprzedniej wartości zmiennej oraz x.

Ten schemat iterowania w celu aktualizacji wartości zmiennej jest zwyczajowo nazywany wzorcem inkrementalnym. Zmienna przechowująca aktualizowaną wartość nazywana jest zmienną inkrementowaną. Schemat ten będzie się powtarzał raz za razem. Zapamiętajcie tylko, że kluczem do poprawnego działania tego wzorca jest inicjalizacja omawianej zmiennej przed rozpoczęciem iteracji. Po wejściu w iterację należy aktualizować zmienną inkrementowaną.

Informacja

A co by się stało, gdybyśmy ustawili przypisanie runningTotal = 0` w środku pętli for? Nie jestes piewien? Sprawdź sam i się przekonaj.

Poniżej widnieje ten sam program w codelens. Przejdź przez niego krok po kroku, obserwując jak running total gromadzi stopniowo wartość końcową.

(sq_accum3)

Informacja

Ten obszar roboczy jest tutaj dla Twojej wygody. Możesz tu wypróbować dowolny program.




(scratch_05_04)

Sprawdź swoją wiedzę

func-4-1: Rozwazmy poniższy kod:

def square(x):
    runningtotal = 0
    for counter in range(x):
        runningtotal = runningtotal + x
    return runningtotal

Co się wydarzy, gdy inicjalizację zmiennej runningtotal (linię runningtotal = 0) umieścimy w pętli for jako pierwszą instrukcję pęti?






func-4-2: Przeprojektuj program tak, aby dodawał do siebie pierwszych n liczb nieparzystych. Liczba n jest podawana przez użytkownika.

Następna część - Funkcje mogą wywoływać inne funkcje