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: #include <iostream> #include <conio.h>
using namespace std;
void hanoi( int lk, char A, char B, char C ) { if( lk > 0 ) { hanoi( lk - 1, A, C, B ); cout << A << " --> " << C << endl; hanoi( lk - 1, B, A, C ); } }
int main() { int lk; cin >> lk; hanoi( lk, '1', '2', '3' ); getch(); return 0; }
|
|
pekfos |
» 2013-11-21 18:43:11 |
|
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 :)... |
|
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... |
|
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. |
|
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. |
|
pekfos |
» 2013-11-21 20:14:43 #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. |
|
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ę? |
|
« 1 » 2 |