Przeczytaj
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 FibonacciegoCiąg Fibonacciego).
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 RekurencjaRekurencja.
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.
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ść.
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 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++.
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
wzorzec implementacyjny definiujący sposób, w jaki programista postrzega przepływ sterowania i wykonywanie programu