Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wieże Hanoi - Rekurencja

Ostatnio zmodyfikowano 2013-11-23 12:30
Autor Wiadomość
barti2287
Temat założony przez niniejszego użytkownika
Wieże Hanoi - Rekurencja
» 2013-11-21 18:39:46
Witam, napisałem program rozwiązujący zagadkę wież hanoi dla 3 słupków i n krążków. Namęczyłem się cały dzień szukając wyjaśnienia tej metody rekurencyjnej, wikipedia nie pomogła. Rzecz w tym, że korzystając z wikipedii napisałem podobny program do zamieszczonego na wikipedii. Rozumiem co robi, ale nie rozumiem jak. Wiem, że funkcja wywołuje sama siebie ze zmienianą kolejnością warunków i wypisuje dane (ruchy jakie są potrzebne do rozwiązania zagadki). Bardzo bym prosił kogoś o rozpisanie mi sposobu działania programu krok po kroku. Oto kod:

C/C++
#include <iostream>
#include <conio.h>

using namespace std;

// Funkcja rozwiązująca rekurencyjnie zagadkę wież hanoi.
void hanoi( int lk, char A, char B, char C )
{
    if( lk > 0 )
    {
        hanoi( lk - 1, A, C, B ); // Przekłada lk-1 krążków ze źródłowej wieży (A) na pomocniczą (B) przy użyciu wieży docelowej (C).
        cout << A << " --> " << C << endl; // Wyświetla ruch w konsoli.
        hanoi( lk - 1, B, A, C ); // Przekłada lk-1 krążków z pomocniczej wieży (B) na docelową (C) przy użyciu wieży źródłowej (A).
    }
}

int main()
{
    int lk; // Liczba krążków
    cin >> lk;
   
    hanoi( lk, '1', '2', '3' ); // Wywołanie funkcji "hanoi".
    getch();
    return 0;
}
 
P-96944
pekfos
» 2013-11-21 18:43:11
P-96947
barti2287
Temat założony przez niniejszego użytkownika
» 2013-11-21 18:53:52
Dzięki, dam znać czy pomogło jak tylko to wszystko przestudiuje :)...
P-96951
barti2287
Temat założony przez niniejszego użytkownika
» 2013-11-21 19:23:12
Zapoznałem się z tym rozdziałem, ale nadal nie rozumiem jednej rzeczy. W przykładach w kursie do którego zostałem odesłany wywołanie funkcji przez nią samą miało miejsce w warunku, ale odnosiło się do tego co było poza nim. Ale co w moim przypadku, kiedy poza warunkiem nie mamy nic, a w środku 2 rekurencję i instrukcję cout? Na logikę, powinno to działać tak, że zawsze wywoływana jest tylko pierwsza instrukcja warunku (rekurencja) do czasu, kiedy jest on spełniony. Potem miałoby nastąpić wyjście z funkcji, a więc w rezultacie nie otrzymalibyśmy nic. A tymczasem program działa...
P-96957
Dantez
» 2013-11-21 19:31:07
Dodaj sobie do funkcji to:
cout << "LK equals: " << lk << endl;

Zauważ, że funkcja, którą wywołujesz, znów posiada rekurencję i lt ponownie jest zmniejszane - aż do 0.
P-96960
barti2287
Temat założony przez niniejszego użytkownika
» 2013-11-21 20:06:14
To, że jest zmniejszane to zauważyłem. Ale czemu cała funkcja się wykonuje, skoro jej pierwsze zadanie to ponowne wykonanie funkcji (czyli w moim mniemaniu tylko linijki 11 "hanoi( lk - 1, A, C, B );"). Tak, owszem lk się zmniejsza, a gdy dojdzie do zeru funkcja nie wykonuje już instrukcji if i się zakańcza. Ale jak już w poprzednim poście napisałem, wtedy w rezultacie nie otrzymalibyśmy nic. A więc nie rozumiem czemu wykonuje się cała funkcja z całym if-em, skoro powinna się wykonać tylko linijka nr.11.
P-96975
pekfos
» 2013-11-21 20:14:43
C/C++
#include <iostream>

void f( int a )
{
    if( a > 0 )
    {
        std::cout << a << std::endl;
        f( a - 1 );
        std::cout << a << std::endl;
    }
}

int main()
{
    f( 5 );
}
Uruchom to i wyciągnij wnioski.
P-96981
barti2287
Temat założony przez niniejszego użytkownika
» 2013-11-21 20:27:27
Cóż... to zdołało tylko dodać więcej pytań na moją listę...

Udało mi się wywnioskować to, że linijka po rekurencji działa na odwrót i "a" się zwiększa. Ale nie mam bladego pojęcia czemu. Nie wiem też, co się dzieje z tym "a" w warunku. Czy ono też się zmienia poprzez rekurencję?
P-96985
« 1 » 2
  Strona 1 z 2 Następna strona