Wróć do informacji o e-podręczniku Wydrukuj Pobierz materiał do PDF Pobierz materiał do EPUB Pobierz materiał do MOBI Zaloguj się, aby dodać do ulubionych Zaloguj się, aby skopiować i edytować materiał Zaloguj się, aby udostępnić materiał Zaloguj się, aby dodać całą stronę do teczki

Metoda zstępująca

Projektowanie algorytmów – zgodne z metodą zstępującą – polega na rozbijaniu głównego problemu na mniejsze podproblemy. Zanim zaczniemy pisać kod, powinniśmy dokładnie wiedzieć, jakich funkcjonalności potrzebujemy i w jaki sposób mają one ze sobą współdziałać.

Dla lepszego zrozumienia tej koncepcji przeanalizujmy przykład rekurencyjnej metody obliczania wartości elementu ciągu Fibonacciego o indeksie n (więcej informacji o tym zagadnieniu znajdziesz w e‑materiale Ciąg FibonacciegoPMu9Wf5p9Ciąg Fibonacciego).

Ważne!

Rekurencja to technika programowania polegająca na odwoływaniu się procedur lub funkcji do samych siebie, aż do momentu spełnienia warunku podstawowego. Więcej na jej temat dowiesz się z e‑materiału RekurencjaP6Y0RIEgQRekurencja.

By obliczyć wartość elementu o indeksie n, najpierw ustalamy wartość elementu o indeksie n - 1 itd.

Na ilustracji zaprezentowano przykład obliczania elementu ciągu Fibonacciego o indeksie 5.

R1aysrpZyBaBW
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Rozbijając każdy z kroków w taki sposób, przechodzimy do coraz bardziej podstawowych czynności. Postępujemy tak, dopóki nie dojdziemy do bardzo elementarnych operacji, których już nie jesteśmy w stanie podzielić.

Ten sposób projektowania algorytmów jest dosyć czasochłonny, ponieważ każdy krok powinien być dokładnie zaplanowany i przeanalizowany. Błąd w którymkolwiek kroku powoduje wystąpienie dalszych błędów na niższych poziomach. Należy również przemyśleć algorytm pod względem liczby rozwiązywanych podproblemów. Jeżeli będziemy wykonywać zbyt wiele operacji, złożoność algorytmu znacznie wzrośnie. Plusem tego sposobu jest intuicyjność kolejnych kroków algorytmu.

Metoda wstępująca

Jak sugeruje nazwa, tym razem będziemy tworzyć rozwiązanie, zaczynając od podstawowych funkcjonalności. Metoda ta polega na łączeniu oraz budowaniu zależności pomiędzy elementarnymi funkcjami. Nadajemy w ten sposób kształt coraz to bardziej skomplikowanym i zaawansowanym strukturom, aż dojdziemy do kompletnego programu rozwiązującego problem.

W przypadku obliczenia elementu ciągu Fibonacciego o indeksie 5 zaczynamy od obliczenia pierwszego elementu ciągu Fibonacciego – czyli elementu o indeksie 0 (n = 0). Następnie wykorzystujemy znajomość elementu o indeksie 0 do obliczenia elementu o indeksie 1 (n + 1) itd.

Inną analogią dla tej metody jest stawianie budowli z klocków. Do klocków możemy porównać elementarne i niezależne od siebie funkcje. Nie powstały one z myślą o konkretnych projektach, dzięki czemu są uniwersalne. Mając je do dyspozycji, jesteśmy w stanie zbudować różnorodne konstrukcje, dowolnie łącząc elementy w całość.

R4Tg3Vq6E9wCA
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Przedstawiony schemat pokazuje, jak działa metoda wstępująca. Na najniższym poziomie mamy najbardziej podstawowe elementy, które łączymy w coraz bardziej skomplikowane systemy. Na najwyższym poziomie znajduje się cały gotowy system, złożony z elementów, które mieliśmy do dyspozycji na początku.

Paradygmatem programowaniaparadygmat programowaniaParadygmatem programowania korzystającym z metody wstępującej jest programowanie obiektowe.

Wady i zalety

W przypadku metody zstępującej jej największą wadą jest czas potrzebny do rozbicia problemu na mniejsze podproblemy. Kolejnym minusem jest brak możliwości przetestowania napisanego programu, dopóki nie powstanie jego większa część. Natomiast bardzo dużym plusem jest dokładne rozpatrzenie problemu i nabycie pewności, że wszystko, co implementujemy, ma cel oraz znajduje zastosowanie. Kolejnym plusem jest to, że niektóre podproblemy mogą okazać się wielokrotnego użytku – ich rozwiązań możemy użyć w więcej niż jednym miejscu, co pozwala zaoszczędzić czas.

Metoda wstępująca pozwala na wygodną przebudowę istniejących rozwiązań. Dodawanie nowych funkcji do istniejącego programu jest proste i nie wymaga edytowania całego kodu, co często ma miejsce w przypadku metody zstępującej. Kolejną zaletą jest łatwe testowanie poszczególnych obiektów w pisanym kodzie, ponieważ z założenia są one od siebie niezależne. Wadą takiego podejścia jest, że z początku może być ono bardzo chaotyczne. Bez dogłębnej analizy problemu nie jesteśmy w stanie stwierdzić, czego tak naprawdę potrzebujemy. Bardzo często zaczynamy zdawać sobie z tego sprawę wraz z pisaniem kodu.

W praktyce metody zstępującej używamy w językach strukturalnych takich jak np. C czy Fortran, natomiast metody wstępującej w językach obiektowych, np. Java czy C++.

Ciekawostka

Zarówno metoda wstępująca, jak i zstępująca znalazły swoje zastosowanie także poza branżą informatyczną. Wykorzystywane są one m.in. w zarządzaniu przy planowaniu struktury podziału pracy (WBS – Work Breakdown Structure), w nanotechnologii czy też w neurobiologii.

Słownik

paradygmat programowania
paradygmat programowania

wzorzec implementacyjny definiujący sposób, w jaki programista postrzega przepływ sterowania i wykonywanie programu