Jaki jest dobry przykład rekurencji inny niż generowanie ciągu Fibonacciego?

Możliwe duplikaty:
rzeczywiste przykłady rekurencji
przykłady funkcji rekurencyjnych

Widzę, że większość samouczków języka programowania uczy rekurencji używając prostego przykładu, który jest jak generować ciąg Fibonacciego, moje pytanie brzmi, czy jest inny dobry przykład inny niż generowanie ciągu Fibonacciego, aby wyjaśnić, jak działa rekurencja?

Author: Community, 2011-02-09

23 answers

Klasykiem jest binarne wyszukiwanie drzewa:

def findval (node,val):
    if node == null:
        return null
    if node.val = val:
        return node
    if node.val > val:
        return findval (node.left,val)
    return findval (node.right,val)

findval (root,thing_to_find)

To może być trochę bardziej złożone niż prosta formuła, ale jest to" chleb i masło " wykorzystanie rekurencji, i ilustruje najlepsze miejsca do jej użycia, że gdzie poziomy rekurencji są zminimalizowane.

Mam na myśli: Ty możesz dodać dwie liczby nieujemne z:

def add (a,b):
    if b == 0:
        return a
    return add (a+1,b-1)

Ale szybko zabraknie Ci miejsca na stosie dla dużych liczb (chyba że kompilator zoptymalizuje rekursje końcowe oczywiście, ale prawdopodobnie powinieneś to zignorować ze względu na poziom nauczania, którym się zajmujesz).

 37
Author: paxdiablo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-09 23:08:13

Inne odpowiedzi wspominają o różnych algorytmach, co jest całkowicie w porządku, ale jeśli chcesz nieco bardziej "konkretny" przykład, możesz wyświetlić listę wszystkich plików w jakimś katalogu i jego podkatalogach. Hierarchiczny system plików jest dobrze znanym przykładem rekurencyjnej (drzewiastej) struktury, a za pomocą tego konkretnego przykładu można pokazać Wyszukiwanie głębokości i szerokości.

 28
Author: Philipp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-09 14:58:37

Moim ulubionym przykładem rekurencji jest Towers of Hanoi: aby przesunąć stos pionków z bieguna A do bieguna B, przesuwasz wszystko powyżej najniższego pionka na biegun, który nie jest A lub B, następnie przesuwasz najniższy pionek do B, a następnie przesuwasz stos, który położyłeś na "słup pomocnika" na szczycie najniższego pionka. W pierwszym i trzecim kroku wykonujemy tę instrukcję rekurencyjnie. Zobacz link dla dłuższego wyjaśnienia:)

 25
Author: etarion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-09 13:07:21

Sprawdź dla palyndrom :

bool recursivePalindrome(std::string str, unsigned int index = 0) {
    if (index > str.length()/2) return true;
    else if (str[index] == str[str.length()-index-1])
        return recursivePalindrome(str, ++index);
    else return false;
}

Albo w mniej poważnej nucie:)

void StackOverflow()
{
   StackOverflow();
}
 20
Author: Luis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-09 13:06:17

Jak o znalezieniu factorial.

int GetFactorial(int n )
{
  if ( n==0) return 1;
  return n*GetFactorial(n-1);
}

Idea jest taka, że czynnik jest definiowany rekurencyjnie jako iloczyn n i czynnik (n-1). Z definicji rekurencyjnej otrzymujemy rekurencję.

 15
Author: Shamim Hafiz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-09 12:59:12

Przemierzanie hierarchii katalogów drzewa katalogów jako części systemu plików jest dobrym przykładem w świecie rzeczywistym. Zajrzyj do tego posta dla przykładu C++:

Dlaczego mam problemy z rekurencyjnym usuwaniem katalogów?

 12
Author: Doc Brown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:40
  • większość innych przykładów podanych tutaj to przykłady matematyczne, które naprawdę ilustrują to samo zastosowanie rekursji.
  • warianty wyszukiwania i sortowania są dobrymi przykładami algorytmów, ale często są zbyt skomplikowane dla początkujących.
  • Wieże Hanoi to klasyka, ale całkiem wymyślna.

================

Przykładem, którego używam do wykazania prostej mocy rekurencji, jest rekurencyjne przetwarzanie plików w katalogu drzewo.

Oto przykład C#

void ProcessFiles( string sFolder )
{
    foreach( string f in Directory.GetFiles( sFolder ) )
    {
        DoSomethingTo( f );
    }
    foreach( string d in Directory.GetDirectories( sFolder ))
    {
        ProcessFiles( d );
    }
}
 10
Author: thrag,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-09 16:34:47

Sortowanie scalające jest całkiem dobrym przykładem algorytmu, który jest łatwiejszy do odczytania i zrozumienia, gdy jest zaimplementowany rekurencyjnie.

Oto mała, wysokopoziomowa wersja pseudokodu sortowania Merge:

def merge_sort(List sortlist)
    if sortlist.length <= 1 return sortlist
    split sortlist into leftlist and rightlist
    return merge(merge_sort(leftlist), merge_sort(rightlist))   

def merge(List leftlist, List rightlist)
    while(leftlist and rightlist not empty)
        compare leftlist.first to rightlist.first
        pop lowest value off its list and append to resultlist
    append any remains of leftlist onto resultlist
    append any remains of rightlist onto resultlist
    return resultlist

Iteracyjna wersja tego jest byłaby znacznie bardziej skomplikowana w pisaniu i wizualizacji.

 10
Author: GrahamS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-09 17:05:07

Istnieje kilka próbek:

Liczby katalońskie :

T(n) = Sum(T(i)*T(n-i)) for all 1 <= i < n

Funkcja Ackermanna :

A(x,y) = y+1 (if x = 0)
A(x,y) = A(x-1,1) (if y=0)
A(x,y) = A(x-1, A(x,y-1)) otherwise.

Simple Maze problem

Znalezienie Hamiltonian Path problem

Factorial.

I możesz zobaczyć stronę wiki dla innych odniesień.

 5
Author: Saeed Amiri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-09 13:10:04

Dobre przykłady rekurencji są często związane z przypadkami, w których podstawowa struktura danych lub sam problem jest rekurencyjny: drzewa, wykresy, algorytmy wykorzystujące podejście divide and conquer (jak wiele rodzajów), parser rekurencyjnych gramatyk( jak popularne wyrażenia arytmetyczne), znajdź strategię dla szachowych gier dwóch graczy (dla prostego przykład rozważ Nim), problemy kombinacyjne itp.

 5
Author: kriss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-09 15:44:59

Spróbuj rekurencyjnego wyszukiwania binarnego: http://www.fredosaurus.com/notes-cpp/algorithms/searching/rbinarysearch.html

Lub rekurencyjny szybki sort: http://www.dreamincode.net/forums/topic/72311-recursive-quicksort-algorithm/

To tylko dwa małe przykłady w ogromnym świecie funkcji rekurencyjnych.

 3
Author: Joe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-09 12:59:35

Ocena wyrażeń arytmetycznych może być wykonywana rekurencyjnie lub iteracyjnie za pomocą stosu. Porównanie tych dwóch podejść może być dość pouczające.

 3
Author: Ferruccio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-09 13:13:34

Moja teściowa wzięła kurs wprowadzający do C. miała problem z pracą domową, coś w stylu:

Masz pasek Metalu (Długość len), a liczba zlecenia (n) cięcia metalu na różne długości. Chcesz zmaksymalizować ilość użytego metalu, ale nie może przekraczać całkowitej długości.

Instruktor zasugerował iterację od 1 do 2**N w systemie binarnym, wyłączając kolejność, jeśli jej odpowiedni bit wynosi 0 I włączając kolejność, jeśli jego bit wynosi 1, przy zachowaniu maksymalnej sumy. Jego propozycja przebiegała w czasie wielomianowym.

Inne rozwiązanie istnieje przy użyciu rekurencyjnego algorytmu knapsack . Możesz iterować z len do 1 i najpierw przeszukać głębię, aby rekurencyjnie znaleźć sumę długości.

Innym obszarem, w którym użyłem rekurencji było kodowanie Huffmana (do kompresji ciągu znaków), ale nie ma to intuicyjnego odczucia problemu plecaka.

Rekurencja jest cudowna koncepcja, która jest radykalnie inna. Najlepsze życzenia w nauce lub nauczaniu.

 1
Author: rajah9,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-09 14:39:48

Funkcja Ackermanna:

/* undefined if m and n are negative */
uint32 ackermann( uint32 m, uint32 n )
{
  if( m < 0 && n < 0 ) { exit(1); /* invalid m and n */ }

  if( m == 0 ){ return n + 1; }

  if( m > 0 && n == 0 ){ return ackermann( m - 1, 1 ); }

  if( m > 0 && n > 0 ){ return ackermann( m - 1, ackermann(m, n - 1) ); }
}

Wielokrotne porównania m > 0 są zbędne (i można je uprościć). Pozostawienie ich jako-is pokazuje jednak standardową definicję funkcji Ackermanna.

Ale nie trzeba iść tak daleko poza matematyczną krawędź, aby znaleźć interesujące funkcje rekurencyjne inne niż liczby Fibonnaciego.

Masz największy wspólny mianownik (GDC) funkcja, quicksort i zawsze typowy binarny algorytm wyszukiwania.

 1
Author: luis.espinal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-09 17:00:34

Wszystko, co ma hierarchię. Na przykład wymieniając wszystkich pracowników poniżej swojego szefa.

 1
Author: Carra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-09 17:20:46

Rekurencja znajduje swoje podstawy w indukcji matematycznej i powinna być nauczana jako taka.

Definiowanie funkcji przez indukcję może być wyraźnie widoczne przy przetwarzaniu listy. Jest wiele rzeczy do powiedzenia na temat fold na przykład.

Następnie przejdź do drzew.

 1
Author: Alexandre C.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-09 17:24:44

To oczywiście nie C++, ale koncepcja jest dźwiękowa:

PHP rekurencyjnie przemierza zagnieżdżone wielowymiarowe tablice:

public function recurse_me($collection) {
    foreach ($collection as $value) {
        if (is_array($value)) {
            $this->recurse_me($value);
        } else {
            // process value.
        }
    }
}
 1
Author: Stephen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-09 17:43:03

Pamiętam, że rozumiałem rekurencję pisząc program, który wyszukuje drabiny wyrazów . W danym słowniku.

 1
Author: Kostya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-09 18:27:07

Przykładem akademickim jest Faktoria

N!

Kalkulator. W prawdziwym życiu, dostajesz matematyczne libs.

 0
Author: jpinto3912,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-09 12:57:54

Istnieją algorytmy sortowania, które opierają się na rekurencji.

A następnie, jest wyszukiwanie binarne , które jest zaimplementowane z rekurencją.

 0
Author: René Nyffenegger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-09 12:59:09
 0
Author: biziclop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-09 13:01:58

Sortowanie sterty jest również dobrym przykładem. Można o tym przeczytać w "wstępie do algorytmów" Cormena, Rivesta i innych. Świetna książka, mam nadzieję, że znajdziesz tam wiele ciekawych

 0
Author: Kos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-09 13:06:45

Wiele operacji na strukturach typu linked-node może być rekurencyjnych. Inni wspominali o BST, ale jeśli nie chcesz wyjaśniać, czym one są, rozważ poszukiwanie najwyższej wartości w liniowej, niesortowanej liście:

int MaxValue(Node node)
{
    if (node == null)
        return 0;

    if (node.Next == null)
        return node.Value;

    int maxNext = MaxValue(node.Next);
    return node.Value > maxNext ? node.Value : maxNext;
}

Listy (w tym przypadku listy połączone) są bardzo łatwe do wyjaśnienia w rzeczywistych warunkach; Twoi odbiorcy nie muszą nawet mieć zaplecza programistycznego. Można go po prostu opisać jako grupę niesortowanych pól lub listę liczb.

 0
Author: Justin Morgan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-09 17:05:15