Rekurencja. Rekurencja zwana także rekursją jest jedną z najważniejszych metod konstruowania rozwiązań i algorytmów.

Podobne dokumenty
Rekurencja. Rekurencja zwana także rekursją jest jedną z najważniejszych metod konstruowania rozwiązań i algorytmów.

Metoda "DZIEL i ZWYCIĘŻAJ"

Rekurencja. Rekurencja zwana także rekursją jest jedną z najważniejszych metod konstruowania rozwiązań i algorytmów.

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 9. Karol Tarnowski A-1 p.

Strategia "dziel i zwyciężaj"

Analiza algorytmów zadania podstawowe

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 9 Rekurencja

Wykład 3. Metoda dziel i zwyciężaj

Wstęp do programowania

Rekurencja. Przykład. Rozważmy ciąg

Programowanie w VB Proste algorytmy sortowania

Teoretyczne podstawy informatyki

Informatyka A. Algorytmy

Jeszcze o algorytmach

Definicja. Ciąg wejściowy: Funkcja uporządkowująca: Sortowanie polega na: a 1, a 2,, a n-1, a n. f(a 1 ) f(a 2 ) f(a n )

Rekurencja (rekursja)

ALGORYTMY I STRUKTURY DANYCH

Sortowanie danych. Jolanta Bachan. Podstawy programowania

Znajdowanie największego i najmniejszego elementu w zbiorze n liczb całkowitych

Podstawy Informatyki. Metalurgia, I rok. Rekurencja. skomplikowane zadanie. Rekurencja

Podstawy Informatyki. Metalurgia, I rok. Wykład 5 Rekurencja

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Analiza algorytmów zadania podstawowe

Algorytmy i Struktury Danych, 2. ćwiczenia

Algorytmy i Struktury Danych.

Rekurencja. Dla rozwiązania danego problemu, algorytm wywołuje sam siebie przy rozwiązywaniu podobnych podproblemów. Przykład: silnia: n! = n(n-1)!

Sortowanie przez scalanie

TEORETYCZNE PODSTAWY INFORMATYKI

Wykład 8. Rekurencja. Iterować jest rzeczą ludzką, wykonywać rekursywnie boską. L. Peter Deutsch

1 Metody rozwiązywania równań nieliniowych. Postawienie problemu

Algorytm selekcji Hoare a. Łukasz Miemus

Struktury danych i złożoność obliczeniowa Wykład 2. Prof. dr hab. inż. Jan Magott

Uwaga: Funkcja zamień(a[j],a[j+s]) zamienia miejscami wartości A[j] oraz A[j+s].

Wstęp do programowania. Dziel i rządź. Piotr Chrząstowski-Wachtel

Programowanie dynamiczne

operacje porównania, a jeśli jest to konieczne ze względu na złe uporządkowanie porównywanych liczb zmieniamy ich kolejność, czyli przestawiamy je.

Zaawansowane algorytmy i struktury danych

Algorytmy sortujące i wyszukujące

Zajęcia: VBA TEMAT: VBA PROCEDURY NUMERYCZNE Metoda bisekcji i metoda trapezów

Podstawowe algorytmy i ich implementacje w C. Wykład 9

REKURENCJA W JĘZYKU HASKELL. Autor: Walczak Michał

Programowanie proceduralne INP001210WL rok akademicki 2017/18 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Zaawansowane algorytmy i struktury danych

Efektywna metoda sortowania sortowanie przez scalanie

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

Rekurencja/rekursja. Iluzja istnienia wielu kopii tego samego algorytmu (aktywacji) Tylko jedna aktywacja jest aktywna w danej chwili

Poprawność semantyczna

Luty 2001 Algorytmy (4) 2000/2001

Zadanie 1. Zmiana systemów. Zadanie 2. Szyfr Cezara. Zadanie 3. Czy liczba jest doskonała. Zadanie 4. Rozkład liczby na czynniki pierwsze Zadanie 5.

Matematyczne Podstawy Informatyki

Rekurencja. Przygotowała: Agnieszka Reiter

Technologie informacyjne Wykład VII-IX

METODY NUMERYCZNE. Wykład 4. Numeryczne rozwiązywanie równań nieliniowych z jedną niewiadomą. prof. dr hab.inż. Katarzyna Zakrzewska

Metody numeryczne I Równania nieliniowe

Wykład 2. Poprawność algorytmów

Algorytmy i struktury danych. Wykład 4

1.1. Uzupełnij poniższą tabelę: i wynik(i)

Algorytmy i Struktury Danych, 2. ćwiczenia

Sortowanie. LABORKA Piotr Ciskowski

Rekurencje. Jeśli algorytm zawiera wywołanie samego siebie, jego czas działania moŝe być określony rekurencją. Przykład: sortowanie przez scalanie:

Programowanie Równoległe i Rozproszone. Algorytm Kung a. Algorytm Kung a. Programowanie Równoległe i Rozproszone Wykład 8. Przygotował: Lucjan Stapp

Przykładowe zadania z teorii liczb

Funkcja kwadratowa. f(x) = ax 2 + bx + c = a

Wstęp do Programowania potok funkcyjny

Programowanie dynamiczne cz. 2

Teoretyczne podstawy informatyki

Indukcja. Materiały pomocnicze do wykładu. wykładowca: dr Magdalena Kacprzak

Algorytm. a programowanie -

Rozwiązywanie równań nieliniowych

Metody rozwiązywania równań nieliniowych

Zadanie 1. Korale (8 pkt) Rozważamy następującą rekurencyjną procedurę Korale, której parametrem jest dodatnia liczba całkowita n.

Algorytmy i struktury danych. Co dziś? Tytułem przypomnienia metoda dziel i zwyciężaj. Wykład VIII Elementarne techniki algorytmiczne

TEORETYCZNE PODSTAWY INFORMATYKI

Klasa 2 INFORMATYKA. dla szkół ponadgimnazjalnych zakres rozszerzony. Założone osiągnięcia ucznia wymagania edukacyjne na. poszczególne oceny

Matematyka dyskretna

Podstawy programowania. Wykład: 13. Rekurencja. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Funkcja kwadratowa. f(x) = ax 2 + bx + c,

Matematyka Dyskretna. Andrzej Szepietowski. 25 czerwca 2002 roku

Instrukcje pętli przykłady. Odgadywanie hasła. 1) Program pyta o hasło i podaje adres, gdy hasło poprawne lub komunikat o błędnym haśle.

Metody numeryczne w przykładach

Programowanie dynamiczne

Sortowanie zewnętrzne

Znaleźć wzór ogólny i zbadać istnienie granicy ciągu określonego rekurencyjnie:

Wyszukiwanie binarne

RÓWNANIA NIELINIOWE Maciej Patan

Rozwiązywanie równań nieliniowych i ich układów. Wyznaczanie zer wielomianów.

Obliczenia na stosie. Wykład 9. Obliczenia na stosie. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 266 / 303

Algorytmy i Struktury Danych

Złożoność obliczeniowa zadania, zestaw 2

Algorytmy sortujące 1

Zadania do wykonania. Rozwiązując poniższe zadania użyj pętlę for.

Sortowanie - wybrane algorytmy

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Algorytmy przeszukiwania

5. Podstawowe algorytmy i ich cechy.

znalezienia elementu w zbiorze, gdy w nim jest; dołączenia nowego elementu w odpowiednie miejsce, aby zbiór pozostał nadal uporządkowany.

Temat: Algorytmy zachłanne

Wstęp do programowania

12. Rekurencja. UWAGA Trzeba bardzo dokładnie ustalić <warunek>, żeby mieć pewność, że ciąg wywołań się zakończy.

Macierze. Rozdział Działania na macierzach

Transkrypt:

Rekurencja Rekurencja zwana także rekursją jest jedną z najważniejszych metod konstruowania rozwiązań i algorytmów. Zgodnie ze znaczeniem informatycznym algorytm rekurencyjny to taki który korzysta z samego siebie, a program rekurencyjny to taki który wywołuje sam siebie. Cechy algorytmów rekurencyjnych: - zakończenie algorytmu jest jasno określone - złożony problem zostaje rozłożony na problem elementarny, który umiemy rozwiązać, i na problem o mniejszym stopniu komplikacji, niż ten z którym mieliśmy do czynienia na początku Typowym przykładem zastosowania rekurencji jest liczenie n! zdefiniowanej jako: n! = n*(n-1)! gdy n>=1 n! = 1 gdy n=0 Program rekurencyjny liczący wielkość n! może wyglądać następująco: funkcja silnia(n) Jeśli (n = 0) to silnia=1 w przeciwnym wypadku silnia=n*silnia(n-1) wywołanie samego siebie

Zakończenie powyższego algorytmu/programu jest jasno określone: - n=0 (silnia została policzona) Złożony problem zostaje rozbity na problem elementarny i na analogiczny problem tylko o mniejszym stopniu skomplikowania: - z zadania liczenia n! schodzimy po wywołaniu do zadania liczenia n-1 - elementarny problem to dokonanie mnożenia Schemat obliczeń dla n=3 - pionowe strzałki w dół oznaczają wywołania rekurencyjne, tzn. zagłębianie się programu z poziomu n na poziom n-1 itd. w celu dotarcia do przypadku elementarnego 0!

- poziome strzałki oznaczają obliczanie wyników cząstkowych - ukośne strzałki prezentują proces przekazywania wyniku cząstkowego z poziomu niższego na wyższy Podstawowe błędy przy konstruowaniu programów rekurencyjnych: - złe określenie warunku zakończenia programu - niewłaściwa, nieefektywna metoda rozwiązania problemu Schemat Hornera Schemat Hornera to bardzo powszechna metoda stosowana do rozwiązywania wielu zadań min. do znajdowania reprezentacji liczby w innych systemach liczenia. Rozważmy zadanie liczenia wartości wielomianu stopnia n: y = W n (x) = a 0 *x n + a 1 *x n-1 + a 2 *x n-2 +... + a n-1 *x + a n Najprostsze rozwiązanie iteracyjne polega na konstruowaniu wyrazów, które następnie dodajemy zgodnie ze wzorem przy czym przyjmujemy, że współczynniki tworzą wektor a(0), a(1),..., a(n).

Wielomian W n (x) można też zapisać inaczej zgodnie ze schematem Hornera: Y = W n (x) = = (a 0 *x n-1 + a 1 *x n-2 + a 2 *x n-3 +... + a n-1 )*x +a n = = W n-1 (x)*x + a n = = ((a 0 *x n-2 + a 1 *x n-3 + a 2 *x n-4 +... + a n-2 )*x+ a n-1 )*x +a n = = (W n-2 (x)*x + a n-1 )*x + a n = = (...(( a 0 *x+ a 1 )*x + a 2 )*x +... + a n-1 )*x +a n = = (...(( W 1 (x)*x + a 2 )*x +... + a n-1 )*x +a n

Algorytm napisany zgodnie z tym schematem wyglądałby nieco inaczej niż poprzednia wersja. Algorytm mimo tego, że zawiera wyrażenie y=y*x+a(i) nie jest w pełni algorytmem rekurencyjnym. Pełny zapis rekurencyjny: a 0 gdy n=0 W n (x) = W n-1 (x)*x + a n gdy n 1

1) Wartość wielomianu stopnia n, W n (x) jest liczona z wyrażenia zawierającego wielomian o jeden stopień mniejszy W n-1 (x). 2) Dla n=0 podana jest wartość definiowanej wielkości a 0 i jest to warunek zakończenia rekurencji, dzięki któremu ciąg kolejnych odwołań do wielkości W k (x) ma swój koniec. Schemat rekurencji dla wielomianu W n (x) jest podobny do schematu dla silni ( n! ). W schemacie rekurencyjnym wyróżniamy dwa etapy: 1) Wywołania rekurencyjne, które kończy skorzystanie z warunku zakończenia rekurencji. 2) Powrót do kolejnych wywołań, obejmujący wykonywanie właściwych obliczeń lub tylko wstawianie wyników z

niższych poziomów. Realizacja algorytmu rekurencyjnego wymaga zapisania go w postaci procedury, która może wywoływać samą siebie. Procedura często zawiera parametr określający poziom rekurencji czyli stopień zagłębiania się wywołań. Liczby Fibonacciego Zadanie z 1202 roku "Mamy parę nowo narodzonych królików i o każdej parze królików zakładamy, że : - nowa para staje się płodna po miesiącu życia - każda płodna para rodzi jedną parę nowych królików w miesiącu - króliki nigdy nie umierają Ile będzie królików po upływie k miesięcy? " Możemy narysować schemat (M- para młodych, R- para rozmnażająca się):

Ze schematu dostajemy ciąg liczb: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 itd. Wniosek: w kolejnym miesiącu liczba par królików jest równa liczbie par z poprzedniego miesiąca plus liczba par nowo narodzonych (tj. tyle ile było par dwa miesiące wcześniej. Zapis rekurencyjny rozwiązania jest postaci: 1 dla k = 1, 2 F k = F k-1 + F k-2 dla k > 2 FUNCTION fib(x:integer):integer; BEGIN IF x <= 2 THEN fib:=1 ELSE fib:= fib(x-1)+fib(x-2); END; Schemat obliczeń dla fib(5):

Rekurencyjne liczenie ciągu Fibonacciego prowadzi do wielokrotnego powtarzania tych samych obliczeń - zacieniowana część schematu. Efektu tego można uniknąć stosując schemat iteracyjny: 1) Jeśli k=1 lub k=2, to przyjmij F k = 1 i zakończ 2) W przeciwnym wypadku: a) przyjmij Fib1=1 i Fib2 =1 b) wykonaj k-2 razy następujące instrukcje Fib=Fib1+Fib2 Fib2=Fib1 Fib1=Fib 3) Wynikiem jest Fib

Metoda "DZIEL i ZWYCIĘŻAJ" W metodzie najczęściej wyróżnić można trzy podstawowe kroki: 1. Podziel zestaw danych na dwie, równe części (w przypadku nieparzystej liczby wyrazów jedna część będzie o 1 wyraz większa) 2. Zastosuj algorytm dla każdej z nich oddzielnie, chyba że pozostał już tylko jeden element 3. Połącz, jeśli potrzeba, rozwiazania dla każdej z cześci w całość Najmniejszy i największy element zbioru n-elementowego Aby znaleźć rozpiętość zbioru należy znaleźć maksimum i minimum, a potem policzyć różnicę. Można wykorzystać dwukrotnie metodę przeszukiwania liniowego (algorytmy Min, Max) - 2*(n-1) porównań. Algorytmy Min, Max można połączyć, aby poszukiwania były bardziej efektywne, zgodnie z przepisem: Krok 1: {podział zbioru na dwa podzbiory} Z elementów zbioru utworzyć pary ( dla nieparzystego n pozostaje dodatkowy element z). Porównać elementy w parach i gdy x > y to dołączyć x do zbioru (M) kandydatów na maksimum, y do zbioru (N) kandydatów na minimum. W przeciwnym razie postąpic odwrotnie. Krok 2: Znaleźć maksimum w zbiorze M za pomocą algorytmu Max. Krok 3: Znaleźć minimum w zbiorze N za pomocą algorytmu Min. Krok 4: Jeśli n jest nieparzyste to - jeśli z < min to min = z, w przeciwnym razie - jeśli z > max to max = z.

W powyższej formie algorytm można zrealizować wykorzystując trzy podprogramy: 1. służący do podziału zbioru na dwa mniejsze - krok 1, 2. liczący maksimum (Max) - krok 2, 3. liczący minimum (Min) - krok 3 Można wprowadzić dwa usprawnienia : A) Zamiast tworzyć zbiory M i N można przestawiać pary (np. jeśli dla pary zachodzi x > y ) - w ten sposób po pierwszym kroku na nieparzystych miejscach tablicy będą elementy zbioru N, na parzystych elementy zbioru M. B) Jeśli n nieparzyste to przedłużyć ciąg dublując ostatni element tablicy - w ten sposób można pozbyć się kroku 4 i ujednolicić kroki 2 i 3 (minimum jest szukane w połowie komórek tablicy o indeksach nieparzystych, a maksimum w drugiej połowie o indeksach parzystych). Dla n parzystego algorytm wykonuje 3*n/2-2 = 2*(n-1) n/2 porównań ( w stosunku do algorytmu liniowego mniej o n/2 porównań). Algorytm Min-Max jest przykładem zastosowania metody "dziel i zwyciężaj" i można w nim wyróżnić trzy etapy: - Podziel problem na pod-problemy. - Znajdź rozwiązania pod-problemów. - Połącz rozwiązania pod-problemów w rozwiązanie głównego problemu. Dodatkowo pod-problemy powinny mieć następujące własności: 1a. Problem jest dzielony na takie same lub bardzo podobne pod-problemy. 1b. Liczba pod-problemów wynosi co najmniej 2. 1c. Pod-problemy są rozwiązywane na podzbiorach zbioru danych, w których liczba elementów jest niemal jednakowa i stanowi stałą część całego zbioru. W metodzie "dziel i zwyciężaj" najczęściej pod-problemy, na które rozkładamy problem, są tym samym problemem, ale dla mniejszego zbioru danych. Można więc zastosować algorytm rekurencyjny.

Algorytm Min-Max wykorzystuje metodę dziel i zwyciężaj jedynie w pierwszym kroku, ale wersja rekurencyjna wykorzystuje metodę "dziel i zwyciężaj" w każdym kroku. Algorytm Min_Max_Rek(Z,max,min) - wersja rekurencyjna {Z- zbiór liczb; max, min -największy, najmniejszy element} Krok 1: Jeśli zbiór Z składa się z jednego elementu (z), to min = z, max = z. Jeśli zbiór Z składa się z dwóch elementów, to wartość większego z nich przypisz do max, a wartość mniejszego z nich do min. Krok 2: W przeciwnym razie: 2a: Podziel zbiór Z na dwa podzbiory Z 1 i Z 2 o tej samej lub niemal tej samej liczbie elementów. 2b: Wykonaj ten sam algorytm dla (Z 1, max 1, min 1 ) 2c: Wykonaj ten sam algorytm dla (Z 2, max 2, min 2 ) 2d: Wartość większej z liczb max 1, max 2 przypisz do max, wartość mniejszej z liczb min 1, min 2 przypisz do min. Bardzo dobrym przykładem metody "dziel i zwyciężaj" jest algorytm przeszukiwania binarnego.

Istotnym uogólnieniem tego algorytmu jest schemat binarnego umieszczania, w którym wstawiamy dodatkowy element do ciągu w taki sposób by ciąg pozostał uporządkowany. Algorytm umieszczania binarnego Problem: wstawić do uporządkowanego ciągu nowy element tak aby ciąg pozostał uporządkowany Dane wejściowe: uporządkowany ciąg liczb w tablicy a[k..l], k l, to znaczy a k a k+1... a l oraz element y a k. Wynik: miejsce dla y w ciągu a[k..l], tzn. największe r takie, że a r y a r+1, jeśli k r l -1 ( miejsce znalezione ), lub r = l, gdy a r y (brak miejsca w zakresie k..l). Krok 1. lewy = k, prawy = l Krok 2. s = (lewy+prawy)/2 Krok 3. Jeśli a s y, to lewy = s, a w przeciwnym razie prawy = s-1. Krok 4. Jeśli lewy=prawy, to zakończ algorytm - wtedy r = lewy, a w przeciwnym razie powtórz krok 2. Znajdowanie zera funkcji metodą połowienia przedziału Niech f(x) będzie funkcją ciągłą w przedziale domkniętym [a,b] oraz spełniony jest warunek f(a)*f(b) < 0 (na końcach przedziału funkcja ma różne znaki). Oznacza to, że w przedziale [a,b] jest punkt x * spełniający warunek f(x * ) = 0 czyli będący miejscem zerowym funkcji f(x). Metoda znajdowania x * polega na: 1) podziale przedziału punktem znajdującym się w połowie 2) znalezieniu znaku funkcji f w tym punkcie 3) wyborze z dwóch pod-przedziałów tego na którego końcach funkcja f ma nadal przeciwne znaki

Jeśli przez [a i, b i ] oznaczymy ciąg kolejnych przedziałów generowanych w tej metodzie to mamy do wyboru trzy kryteria przerwania obliczeń: - Różnica między kolejnymi przybliżeniami położenia wartości zera funkcji jest mniejsza niż przyjęta dokładność obliczeń Eps, czyli b i - a i < Eps. - Liczba wykonanych iteracji osiągnęła określoną przez nas granicę MaxIter - Wartość funkcji w kolejnym przybliżeniu jest dostatecznie bliska zeru, czyli mniejsza niż zadana liczba Eps1 ( f( (a i + b i )/2 ) Eps1. Widać, że warunki 1 i 2 są zależne i na podstawie Eps można znaleźć MaxIter które wynosi co najmniej log 2 ((b-a)/eps). Zapis algorytmu jest formalnością. Sortowanie przez scalanie Procedura scalania dwóch ciągów A[1..n] i B[1..m] do ciągu C[1..m+n]: 1.Utwórz liczniki ustawione na początki ciągów A i B -> i=0, j=0 2.Jeżeli A[i] < = B[j] wstaw A[i] do C i zwiększ i o jeden, w przeciwnym przypadku wstaw B[j] do C i zwiększ j o jeden

3. Powtarzaj krok 2 aż wszystkie wyrazy A i B trafią do C Scalenie wymaga maksymalnie n+m operacji porównań elementów i wstawienia ich do tablicy wynikowej. Dowód przez indukcję względem długości n tablicy elementów do posortowania. 1) n=2 Algorytm podzieli dane wejściowe na dwie części, po czym zastosuje dla nich scalanie do posortowanej tablicy 2) Założenie: dla ciągów długości k, k<n algorytm mergesort prawidłowo sortuje owe ciągi. Dla ciągu długości n algorytm podzieli ten ciąg na dwa ciągi długości n/2. Na mocy założenia indukcyjnego ciągi te zostaną prawidłowo podzielone i scalone do dwóch posortowanych ciągów długości n/2. Ciągi te zostaną natomiast scalone przez procedurę scalającą do jednego, posortowanego ciągu długości n.

Algorytm sortowania przez scalanie Problem: posortuj n kluczy w ciąg niemalejący. Dane wejściowe: dodatnia liczba całkowita n, tablica kluczy S indeksowana od 1 do n. Wynik: tablica S, zawierająca klucze w porządku niemalejącym. void mergesort(int n, keytype S[]) { if(n>1) { const int h= n/2, m=n-h; keytype U[1..h], V[1..m]; skopiuj S[1] do S[h] na miejsce U[1] do U[h]; skopiuj S[h+1] do S[n] na miejsce V[1] do v[m]; mergesort(h,u); mergesort(m,v); merge(h,m,u,v,s); } } Agorytm scalania Problem: scal dwie posortowane tablice w jedną posortowaną tablicę. Dane wejściowe: dodatnie liczby całkowite h i m, tablica posortowanych kluczy U indeksowana od 1 do h, tablica posortowanych kluczy V indeksowana od 1 do m. Wynik: tablica S, indeksowana od 1 do h+m, zawierająca klucze z tablic U i V w ramach pojedynczej posortowanej tablicy. void merge(int h, int m, const keytype U[], const keytype V[], keytype S[]) { index i,j,k; i=1; j=1; k=1; while (i<=h && j<=m) { if(u[i]<v[j]) { S[k]=U[i]; i++;

} else { S[k]=V[j]; j++; } k++; } if(i>h) skopiuj V[j] do V[m] na miejsce S[k] do S[h+m]; else skopiuj U[i] do U[h] na miejsce S[k] do S[h+m]; } k U V S(wynik) 1 10 12 20 27 13 15 22 25 10 2 10 12 20 27 13 15 22 25 10 12 3 10 12 20 27 13 15 22 25 10 12 13 4 10 12 20 27 13 15 22 25 10 12 13 15 5 10 12 20 27 13 15 22 25 10 12 13 15 20 6 10 12 20 27 13 15 22 25 10 12 13 15 20 22 7 10 12 20 27 13 15 22 25 10 12 13 15 20 22 25-10 12 20 27 13 15 22 25 10 12 13 15 20 22 25 27 <wartości i j <końcowe Wartości porównywane. Przeciwskazania do używania metody dziel i zwycieżaj Należy unikać metody dziel i zwyciężaj gdy: - Realizacja o rozmiarze n jest dzielona na dwie lub większą liczbę realizacji, z których niemal każda ma rozmiar n - Realizacja o rozmiarze n jest dzielona na niemal n realizacji o rozmiarze n/c, gdzie c jest stałą. Przykładowo algorytm liczenia n-tego wyrazu ciągu Fibonacciego (wersja rekurencyjna), jest algorytmem typu dziel i zwyciężaj, który dzieli realizacje obliczającą n-ty wyraz na dwie pod-realizacje, które obliczają odpowiednio (n-1) ty i (n-2) ty wyraz. Liczba wyrazów obliczanych przez ten algorytm jest wykładnicza w stosunku do n, natomiast liczba wyrazów obliczanych przez wersje iteracyjna jest linowa w stosunku do n.

Z drugiej strony jeśli problem ma charakter wykładniczy to nie ma powodu by unikać prostego rozwiązania typu dziel i zwyciężaj, jak chociażby w problemie wież Hanoi.