1 / 19

Problema Turnurilor din Hanoi din perspectivă informatică

Problema Turnurilor din Hanoi din perspectivă informatică. Realizator, prof. Murărescu Simona Colegiul Tehnic “Mihai Băcescu” – Fă lticeni. Legenda turnurilor.

levana
Download Presentation

Problema Turnurilor din Hanoi din perspectivă informatică

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Problema Turnurilor din Hanoi din perspectivă informatică Realizator, prof. Murărescu Simona Colegiul Tehnic “Mihai Băcescu” – Fălticeni

  2. Legenda turnurilor • O veche legendă spune că într-un templu din Hanoi, sub bolta care arată locul unde este centrul pământului, se odihneşte o placă de bronz în care sunt fixaţi trei ţăruşi de diamant, înalţi de un cot şi subţiri cât mijlocul unei albine.

  3. Legenda turnurilor • Pe unul din aceşti ţăruşi creatorul a înşirat, la facerea lumii, 64 de discuri de aur curat, cel mai mare fiind pe placa de bronz, iar celelalte fiind din ce în ce mai mici mergând până la capătul de sus al ţăruşului. Acesta este turnul lui Brahma.

  4. Legenda turnurilor • Zi şi noapte, fără încetare, un preot mută discurile de pe un ţăruş pe altul, urmând legile de neclintit ale lui Brahma. Acestea cer ca preotul să nu mute decât câte un disc o dată şi să nu aşeze niciodată vreun disc mai mare peste un altul cu diametrul mai mic. Când cele 64 de discuri de aur vor fi astfel mutate de pe ţăruşul unde le-a aşezat Creatorul, pe unul din ceilalţi doi ţăruşi, atunci turnul, templul şi brahmanii se vor preface în neant şi, cu un tunet asurzitor, lumea toată va dispărea…

  5. Legenda turnurilor • Legenda de mai sus a dat naştere unei frumoase probleme de programare cunoscută de toţi elevii de liceu drept „Problema turnurilor din Hanoi”. Numărul total de mişcări pentru a muta discurile conform regulii specificate în legendă este de 264-1 ( adica 18.446.744.073.709.551.615, care se citeste 18 trilioane, 446 biliarde, 744 bilioane, 73 miliarde, 709 milioane, 551 mii, 615). • Acest număr este atât de mare încât, dacă un brahman ar face, fără să obosească, câte o mişcare pe secundă, am mai avea un confortabil număr de miliarde de ani până la sfârşitul lumii prezis de legendă. Ştiind că un an are aproximativ 31.622.400 secunde, reiese că sunt necesari aproximativ 580miliarde de ani pentru a finaliza mutarile !

  6. Problema turnurilor din Hanoi • Matematicianul francez Éduard Lucas a propus in 1883 o problema care a devenit apoi celebra, mai ales datorita faptului ca a prezentat-o sub forma legendei de mai sus.

  7. Problema turnurilor din Hanoi • Se dau 3 tije şi n discuri, situate iniţial pe tija 1, poziţionate de sus în jos în ordinea crescătoare a diametrelor, ca în figura alăturată. n discuri

  8. Problema constă în mutarea discurilor pe tija 2 prin intermediul tijei 3, cu următoarele restricţii: • la fiecare mutare se deplasează un singur disc; • discurile se mută numai de pe o tijă pe alta; • un disc cu diametru mai mare nu poate fi aşezat peste un disc cu diametru mai mic.

  9. Pentru a rezolva problema avem nevoie de noţiunile matematice legate de recursivitate şi de o tehnică de programare numită Divide et Impera (Dezbina şi Stăpâneşte)

  10. Divide et impera se bazeaza pe un principiu extrem de simplu:descompunem problema in doua sau mai multe subprobleme (mai usoare),care se rezolva, iar solutia pentru problema initiala se obtine combinand solutiile problemelor in care a fost descompusa. Se presupune ca fiecare din probleme in care a fost descompusa problema initiala, se poate descompune in alte subprobleme, la fel cum a fost descompusa problema initiala. Procedeul se reia pana cand (in urma descompunerilor repetate) se ajunge la probleme care admit rezolvarea imediata. Divide et impera este o tehnica ce admite o implementare recursiva (autoapelarea).

  11. Notăm hanoi(n,i,j) mulţimea mutărilor necesare pentru a trece n discuri de pe tija i pe tija j (i,j{1,2,3}); • mutarea unui disc de pe tija i pe tija j o vom nota cu i → j.

  12. Rezolvare: • Daca n=1 se face mutarea 1 → 2, adica 21-1=1 mutare, cand se muta discul de pe tija 1pe tija 2. 1→2 Initial Final

  13. Daca n=2 se fac mutarile 1 → 3, 1 → 2, 3 → 2. • In total 22-1=3 mutari 1→3 1→2 3→2 Initial Final

  14. Initial • Pentru n=3, se vor efectua 23-1=7 mutari 1→2 1→3 2→3 1→2 3→1 3→2 1→2 Final

  15. Turnurile din Hanoi 1 2 3

  16. In cazul in care n>3 problema se complica. Notam cu Hanoi(n,1,2,3) sirul mutarilor celor n discuri de pe tija1 pe tija 2, utilizand ca tija intermediara, tija 3. • Conform strategiei Divide et impera incercam sa descompunem problema in alte doua subprobleme de acelasi tip, urmand apoi combinarea solutiilor. In acest sens, observam ca mutarea celor n discuri de pe tija1 pe tija2,utilizand ca tija intermediara tija 3, este echivalenta cu: • mutarea a n-1 discuri de pe tija 1 pe tija 3 , utilizand ca tija intermediara tija 2; • mutarea discului ramas pe tija 1 pe tija 2; • mutarea a n-1 discuri de pe tija 3 pe tija 2 , utilizand ca tija intermediara tija 1. • Parcurgerea celor trei etape permite definirea recursiva a sirului Hanoi(n,1,2,3) astfel: Hanoi(n,1,2,3) = 1→2, daca n=1 Hanoi(n-1,1,3,2), 1→2,Hanoi(n-1,3,2,1), daca n>1

  17. Programul C++ #include<iostream.h> char i,j,k; int n; void hanoi(int n, char i,char j,char k) { if (n==1) cout<<i<<"->"<<j<<endl; else { hanoi(n-1,i,k,j); //mutam n-1 discuri de pe tija 1 pe tija 3 prin intermediul tijei auxiliare 2 cout<<i<<"->"<<j<<endl;//discul ramas pe tija 1 il mut pe tija 2 hanoi(n-1,k,j,i);//mut n-1 discuri de pe tija 3 pe tija 2 prin intermediul tijei auxiliare 1 } } void main() { cout<<"n=";cin>>n;//n nr de discuri i='1';j='2';k='3';//i,j,k - cele 3 tije hanoi(n,i,j,k); }

  18. Efect Pentru n=3 1→2 1→3 2→3 1→2 3→1 3→2 1→2

  19. Bibliografie • Manual de Informatică pentru clasa a X-a profilul matematică – informatică, Editura Niculescu, Livia Ţoca, Cristina Opincaru, ş.a. • Manual de clasa a X-a, profilul matematică – informatică, editura L&S de Tudor Sorin • http://www.lhs.berkeley.edu/Java/Tower/towerhistory.html • www.didactic.ro

More Related