Tower Of Hanoi: algorytm rekurencyjny

Chociaż nie mam żadnego problemu ze zrozumieniem rekurencji, nie mogę się skupić na rekurencyjnym rozwiązaniu problemu Tower Of Hanoi. Oto kod z Wikipedii :

procedure Hanoi(n: integer; source, dest, by: char);
Begin
    if (n=1) then
        writeln('Move the plate from ', source, ' to ', dest)
    else begin
        Hanoi(n-1, source, by, dest);
        writeln('Move the plate from ', source, ' to ', dest);
        Hanoi(n-1, by, dest, source);
    end;
End;

Rozumiem podstawowy przypadek i koncepcję rozbicia problemu na mniejsze kawałki, dopóki nie będziesz w stanie przenieść pojedynczego dysku. Jednak nie mogę zrozumieć, jak dwa rekurencyjne wywołania w przypadku nie-bazowym współpracują ze sobą. Może ktoś mi pomoże? Dzięki.

Author: titaniumdecoy, 2009-08-03

23 answers

Właściwie, sekcja, z której wzięłaś ten kod oferuje również wyjaśnienie:

Aby przenieść n dysków z peg A do peg C:

  1. przesuń dysk n-1 z A na B. pozostawia dysk #n sam na peg a
  2. przesuń dysk #n z A na C
  3. przesuń dyski n-1 z B na C, aby siedziały na dysku #n

Jest całkiem jasne, że najpierw musisz usunąć N - 1 dyski, aby uzyskać dostęp do N . I to musisz przenieść je najpierw do innego peg niż tam, gdzie ma pojawić się pełna Wieża.

Kod w Twoim poście ma trzy argumenty, oprócz liczby dysków: a source peg, a destination peg i a temporary peg, na którym można przechowywać płyty pomiędzy (gdzie każdy dysk o rozmiarze n - 1 pasuje).

Rekurencja dzieje się właściwie dwa razy, tam, raz przed writeln, raz po. Ten Przed writeln poruszy n - 1 dysków na tymczasowym peg, używając docelowego peg jako tymczasowego przechowywania (argumenty w wywołaniu rekurencyjnym są w innej kolejności). Po tym, pozostały dysk zostanie przeniesiony do peg docelowego, a następnie druga rekurencja wymusza przesunięcie całej wieży, przesuwając N - 1 wieżę z PEG temp do Peg docelowego, powyżej dysku n.

 46
Author: Joey,
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
2009-08-03 16:53:53

Rok temu miałem kurs programowania funkcyjnego i narysowałem tę ilustrację dla algorytmu. mam nadzieję, że to pomoże!

(0)  _|_         |          |
    __|__        |          |
   ___|___       |          |
  ____|____  ____|____  ____|____

(1.1) |          |          |
    __|__        |          |
   ___|___      _|_         |
  ____|____  ____|____  ____|____ (A -> B)

(1.2) |          |          |
      |          |          |
   ___|___      _|_       __|__
  ____|____  ____|____  ____|____ (A -> C)

(1.3) |          |          |
      |          |         _|_
   ___|___       |        __|__
  ____|____  ____|____  ____|____ (B -> C)



(2.1) |          |          |
      |          |         _|_
      |       ___|___     __|__
  ____|____  ____|____  ____|____ (A -> B)



(3.1) |          |          |
      |          |          |
     _|_      ___|___     __|__
  ____|____  ____|____  ____|____ (C -> A)

(3.2) |          |          |
      |        __|__        |
     _|_      ___|___       |
  ____|____  ____|____  ____|____ (C -> B)

(3.3) |         _|_         |
      |        __|__        |
      |       ___|___       |
  ____|____  ____|____  ____|____ (A -> B)
Problem 3 pierścieni został podzielony na problem 2 pierścieni (1.x i 3.x)
 32
Author: f0b0s,
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
2016-12-13 14:12:07

Jest dobre wyjaśnienie rekurencyjnej implementacji w http://www.cs.cmu.edu / ~cburch/survey/recurse/hanoiimpl.html .

Podsumowanie jest takie, że jeśli chcesz przenieść dolną płytę z patyczka A do patyczka B, najpierw musisz przenieść wszystkie mniejsze płyty na nią z A do C. drugie wywołanie rekurencyjne polega na przeniesieniu płyt, które przeniosłeś do C z powrotem na B po tym, jak Twój przypadek bazowy przesunął pojedynczą dużą płytę z a do B.

 14
Author: matthock,
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
2009-08-03 16:43:55

Zgadzam się, że ten nie jest natychmiastowy, gdy na niego patrzysz, ale jest dość prosty, gdy się do niego sprowadzasz.

Twoja wieża jest wielkości 1. Więc możesz to zrobić jednym ruchem, od źródła bezpośrednio do dest.

Przypadek rekurencyjny: twoja wieża ma rozmiar N > 1. Więc przenieść górną wieżę wielkości n-1 do dodatkowego kołka (przez), przenieść dolną "wieżę" wielkości 1 do kołka docelowego, i przenieść górną wieżę z by do dest.

Więc w prostym przypadku, masz wieżę wysokości 2:

 _|_    |     |
__|__   |     |
===== ===== =====

Pierwszy krok: przesuń górną wieżę z 2-1 (=1) na dodatkowy kołek (powiedzmy środkowy).

  |     |     |
__|__  _|_    |
===== ===== =====

Następny: przesuń dolny dysk do miejsca docelowego:

  |     |     |
  |    _|_  __|__
===== ===== =====

I na koniec przesuń górną wieżę (2-1)=1 do celu.

  |     |    _|_
  |     |   __|__
===== ===== =====

Jeśli się nad tym zastanowić, nawet jeśli wieża ma 3 lub więcej, zawsze będzie pusty dodatkowy kołek, lub kołek ze wszystkimi większymi dyskami, aby użyć rekurencji podczas zamiany wież.

 13
Author: Sean,
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
2014-08-10 21:43:17

Załóżmy, że chcemy przenieść dysk z A do C do B wtedy:

  1. Przenieś mniejszy dysk do B.
  2. Przesuń inny dysk do C.
  3. Przenieś B do C.
  4. Przesuń z A do B.
  5. Przenieś wszystko z C na A.]}

Jeśli powtórzysz wszystkie powyższe kroki, dysk zostanie przeniesiony.

 4
Author: Deeraj Kumar Choudhary,
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
2012-11-28 21:20:43

Czuję ból!

Chociaż jest to stary post, myślę, że to, co naprawdę trzeba zrozumieć, nie jest podejście "przenieś to na tamto", ale że odpowiedź polega na użyciu efektu ubocznego rekurencji.

Nieocenioną pomocą był dla mnie" mały intrygant", który uczy myślenia i pisania funkcji rekurencyjnych.

Uczy to jednak czytelnika korzystania z wyników zwracanego wyniku w następnym wywołaniu rekurencyjnym.

W wieży Hanoi, odpowiedź nie znajduje się w zwracanym wyniku per se, ale w obserwacji zwracanego wyniku.

Magia występuje w sukcesywnej rearanżacji parametrów funkcji.

Tak problem jest naprawdę w trzech częściach:

  • przenoszenie mniejszej wieży do zapasowego kołka
  • przeniesienie ostatniego dysku do docelowego peg
  • przesunięcie pozostałej wieży na zapasowym kołku do kołka docelowego.

W Schemacie:

(define (th n a b c)
    (if (zero? n) 'done
        (begin
           (th (- n 1) a c b)
           (display (list a c))
           (newline)
           (th (- n 1) b a c))))
(th 5 'source 'spare 'destination)

Jednakże jest wyświetlanie parametrów funkcji, które jest rozwiązaniem problemu i najważniejsze zrozumienie struktury podwójnego drzewa podobne do wywołań.

Rozwiązanie przekazuje również moc proof by inductioni ciepłego blasku wszystkim programistom, którzy zmagali się z konwencjonalnymi strukturami sterowania.

Nawiasem mówiąc, ręczne rozwiązanie problemu jest całkiem satysfakcjonujące.

  • policz liczbę dysków
  • jeśli parzyste, przesuń pierwszy dysk do zapasowego kołka, wykonaj następny legalny ruch (Nie dotyczy górnej płyty). Następnie przesuń górną płytę do docelowego kołka, wykonaj następny legalny ruch (nittd). Następnie przesuń górną płytę do peg źródłowego, wykonaj następny legalny ruch (nittd)...
  • jeśli nieparzyste, przesuń pierwszy dysk do docelowego kołka, wykonaj następny legalny ruch (Nie dotyczy górnego dysku). Następnie przesuń górną płytę do zapasowego kołka, wykonaj następny legalny ruch (nittd). Następnie przesuń górną płytę do peg źródłowego, wykonaj następny legalny ruch (nittd)...

Najlepsze robi się to zawsze trzymając górną płytę tą samą ręką i przesuwając ją zawsze w tym samym kierunku.

Ostateczna liczba ruchów dla n Dysków to 2^n - 1 move n disc to destination jest w połowie procesu.

Wreszcie, to zabawne, jak Wyjaśnienie problem koledze, żonie/mężowi, a nawet psu (nawet tego nie słuchają) może ugruntować oświecenie.

 2
Author: potong,
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
2014-01-15 09:51:29

Po przeczytaniu tych wszystkich wyjaśnień pomyślałem, że rozważę metodę, której użył mój profesor do wyjaśnienia rozwiązania rekurencyjnego Towers of Hanoi. Oto algorytm z N reprezentujący liczbę pierścieni, a A, B, C reprezentujący kołki. Pierwszy parametr funkcji to liczba pierścieni, drugi parametr reprezentuje peg źródłowy, trzeci to peg docelowy, a czwarty to peg zapasowy.

procedure Hanoi(n, A, B, C);
  if n == 1
    move ring n from peg A to peg B
  else
    Hanoi(n-1, A, C, B);
    move ring n-1 from A to C
    Hanoi(n-1, C, B, A);
end;

Uczono mnie w szkole, żeby nigdy nie być wstydzę się myśleć mało. Przyjrzyjmy się więc temu algorytmowi dla n = 5. Pytanie, które należy sobie najpierw zadać, to Jeśli chcę przenieść piąty Pierścień Z A do B, gdzie są pozostałe 4 pierścienie? Jeśli piąty pierścień zajmuje peg A i chcemy go przenieść do peg B, to pozostałe 4 pierścienie mogą znajdować się tylko na peg C. w algorytmie powyżej Funkcja Hanoi (n-1, A, C, B) próbuje przenieść wszystkie te 4 inne pierścienie na peg C, więc pierścień 5 będzie mógł przejść z A do B. podążając za tym algorytmem szukamy na n = 4. Jeśli pierścień 4 zostanie przeniesiony z A do C, gdzie są pierścienie 3 i mniejsze? Mogą być tylko na peg B. Następnie, dla n = 3, jeśli pierścień 3 zostanie przeniesiony z A do B, gdzie są pierścienie 2 i 1? Na peg C oczywiście. Jeśli nadal podążasz za tym wzorcem, możesz wizualizować, co robi algorytm rekurencyjny. To podejście różni się od podejścia nowicjusza tym, że patrzy na ostatni dysk pierwszy i pierwszy dysk ostatni.

 2
Author: MNRC,
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
2015-02-07 22:18:23

Pomyśl o tym jak o stosie ze średnicą dysków reprezentowaną przez liczby całkowite (4,3,2,1) Pierwsze wywołanie rekursji zostanie wywołane 3 razy i w ten sposób zostanie wypełniony stos run-time w następujący sposób

    Pierwsze połączenie: 1. Drugie wezwanie: 2,1. i trzecie wezwanie: 3,2,1.

Po zakończeniu pierwszej rekurencji, zawartość stosu run-time jest przesuwana do środkowego bieguna od największej średnicy do najmniejszej(pierwsza na końcu). Następnie dysk o średnicy 4 zostaje przeniesiony na miejsce.

Drugie wywołanie rekursji jest takie samo jak pierwsze, z wyjątkiem przeniesienia elementów ze środkowego bieguna do miejsca docelowego.

 2
Author: Ahmad,
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
2015-07-14 18:37:43

To proste. Załóżmy, że chcesz przejść z A do C

Jeśli jest tylko jeden dysk, po prostu go przesuń.

Jeśli jest więcej niż jeden dysk, wykonaj

  • Przenieś wszystkie dyski (N-1 dyski), z wyjątkiem dolnego z A do B
  • przesuń dolny dysk z A do C
  • przenieś dyski n-1 z pierwszego kroku z A do C

Należy pamiętać, że przy przenoszeniu dysków n-1 NTH nie będzie problemem (gdy będzie większy niż wszystkie pozostałe)

Zauważ, że przenoszenie dysków n-1 powtarza ten sam problem ponownie, aż n-1 = 1, w którym to przypadku będziesz na pierwszym if (gdzie powinieneś go po prostu przenieść).

 1
Author: Samuel Carrijo,
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
2009-08-03 16:52:35

ODPOWIEDŹ na pytanie, skąd program wie, że parzyste jest " src " do "aux" , a nieparzyste jest " src " do " dst " dla ruchu otwarcia leży w programie. Jeśli złamiesz fist move z 4 dyskami, to wygląda to tak:

hanoi(4, "src", "aux", "dst");
if (disc > 0) {
    hanoi(3, 'src', 'dst', 'aux');
        if (disc > 0) {
            hanoi(2, 'src', 'aux', 'dst');
                if (disc > 0) {
                    hanoi(1, 'src', 'dst', 'aux');
                        if (disc > 0) {
                            hanoi(0, 'src', 'aux', 'dst');
                                END
                        document.writeln("Move disc" + 1 + "from" + Src + "to" + Aux);
                        hanoi(0, 'aux', 'src', 'dst');
                                END
                        }

Również pierwszy ruch z 4 płytami (parzystymi) przechodzi z Src do Aux.

 1
Author: dspkwa,
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
2013-01-06 11:58:50

Jak zasugerowali nasi znajomi, usunąłem dwie poprzednie odpowiedzi i tutaj się Zgadzam.

To daje wam jasne zrozumienie.

Czym jest ogólny algorytm....

Algorytm:

solve(n,s,i,d) //solve n discs from s to d, s-source i-intermediate d-destination
{
    if(n==0)return;
    solve(n-1,s,d,i); // solve n-1 discs from s to i Note:recursive call, not just move
    move from s to d; // after moving n-1 discs from s to d, a left disc in s is moved to d
    solve(n-1,i,s,d); // we have left n-1 disc in 'i', so bringing it to from i to d (recursive call)
}

Oto przykład roboczy Kliknij tutaj

 1
Author: Vivek MVK,
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
2014-05-05 10:37:32
public static void hanoi(int number, String source, String aux, String dest)
{
    if (number == 1)
    {
        System.out.println(source + " - > "+dest);
    }
    else{
        hanoi(number -1, source, dest, aux);
        hanoi(1, source, aux, dest);
        hanoi(number -1, aux, source, dest);
    }
}
 1
Author: Rafael Amsili,
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
2014-11-13 17:57:44
void TOH(int n, int a, int b){
        /*Assuming a as source stack numbered as 1, b as spare stack numbered as 2 and  c as target stack numbered as 3. So once we know values of a and b, we can determine c as there sum is a constant number (3+2+1=)6.
       */
int c = 6-a-b;
if(n==1){
    cout<<"Move from "<<a<<" to "<<b<<"\n";
}
else{
    // Move n-1 disks from 1st to 2nd stack. As we are not allowed to move more than one disks at a time, we do it by recursion. Breaking the problem into a simpler problem.
    TOH(n-1, a, c);
    // Move the last alone disk from 1st to 3rd stack.
    TOH(1, a, b);
    // Put n-1 disks from 2nd to 3rd stack. As we are not allowed to move more than one disks at a time, we do it by recursion. Breaking the problem into a simpler problem.        
    TOH(n-1, c, b);
}
}
int main() {

TOH(2, 1, 3);
cout<<"FINISHED                        \n";
TOH(3, 1, 3);
cout<<"FINISHED                        \n";
TOH(4, 1, 3);
return 0;
}
 1
Author: Aditya Raj,
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
2015-08-24 16:37:35

Istnieją trzy wieże: wieża źródłowa, Wieża docelowa i Wieża pomocnicza. Wieża źródłowa ma wszystkie dyski, a twoim celem jest przeniesienie wszystkich dysków do wieży docelowej i upewnij się, że w ten sposób nigdy nie umieszczasz większego dysku na mniejszym dysku. Możemy rozwiązać ten problem używając rekurencji w poniższych krokach:

Mamy N liczby dysków na wieży źródłowej

Przypadek podstawowy: n = 1 Jeśli w source tower znajduje się tylko jeden dysk, przenieś go do miejsca docelowego Wieża.

Przypadek rekurencyjny: n >1

  • Przenieś górne dyski n-1 z wieży źródłowej do wieży pomocniczej
  • Przenieś jedyny pozostały n-ty dysk (po kroku 1) do miejsca docelowego Wieża
  • Przenieś dyski n-1, które są teraz w wieży pomocniczej, do miejsca przeznaczenia
    tower, używając source tower jako pomocnika.

Kod źródłowy w Javie:

private void towersOfHanoi(int n, char source, char destination, char helper) {
    //Base case, If there is only one disk move it direct from source to destination
    if(n==1){
        System.out.println("Move from "+source+" to "+destination);
    }
    else{
        //Step1: Move the top n-1 disks from source to helper
        towersOfHanoi(n-1, source, helper, destination);
        //Step2: Move the nth disk from source to destination
        System.out.println("Move from "+source+" to "+destination);
        /*Step3: Move the n-1 disks(those you moved from source to helper in step1) 
         * from helper to destination, using source(empty after step2) as helper
         */
        towersOfHanoi(n-1, helper, destination, source);
    }
}
 1
Author: bpjoshi,
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-03-08 12:23:02

Pierwsze wywołanie rekurencyjne przenosi wszystkie kawałki z wyjątkiem największego ze źródła do używając dest jako stosu pomocniczego. Po wykonaniu wszystkie elementy z wyjątkiem największego będą leżeć obok i największy jest wolny. Teraz możesz przenieść największy do dest i użyć innego rekurencyjnego wywołania, aby przenieść wszystkie elementy z by do dest.

Wywołania rekurencyjne nie będą wiedzieć nic o największym kawałku( tzn. zignorują go), ale to jest w porządku, ponieważ wywołania rekurencyjne będą miały do czynienia tylko z kawałki, które są mniejsze, a tym samym mogą być swobodnie przenoszone na i z największego elementu.

 0
Author: sepp2k,
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
2009-08-03 16:43:13

Jako student CS, być może słyszałeś o indukcji matematycznej. Rekurencyjne rozwiązanie Tower Of Hanoi działa analogicznie - tylko inna część jest naprawdę nie zgubić się z B I C, jak były pełne Wieża kończy się.

 0
Author: weismat,
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
2009-08-03 16:47:26

W prostym sensie chodzi o to, aby wypełnić inną wieżę spośród trzech zdefiniowanych wież w tej samej kolejności dysków, co obecnie, bez większego dysku nakładającego się na mały dysk w dowolnym momencie podczas procedury.

Niech "A", " B " I " C " będą trzema wieżami. "A" będzie początkowo wieżą zawierającą płyty "n". "B" może być użyta jako wieża pośrednia, A " C " jako wieża docelowa.

Algo jest następujące:

  1. Przenieś dyski n-1 z wieży " A " do " B " za pomocą "C"
  2. ruch a dysk od " A " do " C "
  3. Przenieś dyski n-1 z wieży " B " do " C " za pomocą "A"

Kod w Javie wygląda następująco:

Public class TowerOfHanoi {

public void TOH(int n, int A , int B , int C){
    if (n>0){
        TOH(n-1,A,C,B);
        System.out.println("Move a disk from tower "+A +" to tower " + C);
        TOH(n-1,B,A,C);
    }
}

public static void main(String[] args) {
    new TowerOfHanoi().TOH(3, 1, 2, 3);
}   

}

 0
Author: mohit verma,
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
2014-10-08 18:37:15

Oto Wyjaśnienie. Spójrz na zdjęcie - >

Tutaj wpisz opis obrazka

Dzwoniąc Movetower(3,a,b,c), zamierzasz przenieść wszystkie 3 dyski z wieży A do wieży B. Więc wywołania sekwencyjne to - >

1. Movetower(3,a,b,c)  // No Move needed
2. Movetower(2,a,c,b)  // No move needed
3. Movetower(1,a,b,c)  // Here is the time to move, move disc1 from a to b
4. Movetower(2,a,c,b)  // Returning to this call again, this is the time to move disc2 from a to c
5. Movetower(1,b,c,a)  // Again the time to move, this time disc1 from b to c
6. Movetower(3,a,b,c)  // Returning to this call again, this is the time to move disc3 from a to b
7. Movetower(2,c,b,a)  // Not the time to move
8. Movetower(1,c,a,b)  // Here is the time to move, move disc1 from c to a
9. Movetower(2,c,b,a)  // Returning to this call again, this is the time to move disc2 from c to b
10.Movetower(1,c,a,b)  // Here is the time to move, move disc1 from a to b

Mam nadzieję, że pomoże:)

Dla animacji: https://www.cs.cmu.edu / ~cburch/survey/recurse/hanoiex.html

 0
Author: jbsu32,
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
2016-08-30 05:25:32

Oto Mój kod rozwiązania problemu Towers of Hanoi przy użyciu rekurencji z golangiem. "package main

import "fmt"

func main() {
    toi(4, "src", "dest", "swap")
}

func toi(n int, from, to, swap string) {
    if n == 0 {
        return
    }
    if n == 1 {
        fmt.Printf("mov %v %v -> %v\n", n, from, to)
        return
    }
    toi(n-1, from, swap, to)
    fmt.Printf("mov %v %v -> %v\n", n, from, to)
    toi(n-1, swap, to, from)
}`
 0
Author: Gaurav Sinha,
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-09-15 22:13:43

Tower (N,source,aux.dest):

  1.  

    if N =1 Then
       Write : Source -> dest
       return
    end of if
    
  2. Przenieś dysk N-1 ze źródła peg do Peg aux

    call Tower (N-1, source, dest, aux)
    
  3. write source - > dest
  4. Przenieś dyski N-1 z peg aux do peg dest

    call Tower (N-1, source, dest, aux)
    
  5. return
 -1
Author: Muhammad Saleem Akhtar,
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
2012-12-02 09:50:03

/** * */ pakiet com.test.recursion;

/** * @ autor kamals1986 algorytm rekurencyjny dla problemu Tower Of Hanoi * algorytm rośnie przez moc (2, n). */ public class TowerOfHanoi {

private static String SOURCE_PEG = "B";

private static String SPARE_PEG = "C";

private static String TARGET_PEG = "A";

public void listSteps(int n, String source, String target, String spare) {
    if (n == 1) {
        System.out.println("Please move from Peg " + source + "\tTo Peg\t"
                + target);
    } else {
        listSteps(n - 1, source, spare, target);
        listSteps(1, source, target, spare);
        listSteps(n - 1, spare, target, source);
    }
}

public static void main(String[] args) {
    long startTime = System.currentTimeMillis();
    new TowerOfHanoi().listSteps(18, SOURCE_PEG, TARGET_PEG, SPARE_PEG);

    long endTime = System.currentTimeMillis();

    System.out.println("Done in " + (endTime - startTime) / 1000
            + "\t seconds");
}

}

 -1
Author: kamals1986,
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
2015-05-17 08:33:45
def Hanoi(n, A, B, C):
    if(n==1): print "move plates to empty peg"
    else:
       Hanoi(n-1, A, B, C)
       print "move"+str(n)+" to peg "+C
       Hanoi(n-1, B, C, A)
 -1
Author: Mick Lin,
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
2016-10-14 04:33:00

Ja też próbuję uzyskać rekurencję.

I found a way i think,

Myślę o tym jak o łańcuchu kroków (Krok nie jest stałą może się zmienić w zależności od poprzedniego węzła)

Muszę rozgryźć 2 rzeczy:

  1. poprzedni węzeł
  2. rodzaj kroku
  3. po kroku co jeszcze przed wywołaniem (jest to argument dla następnego wywołania

Przykład

Factorial

1,2,6,24,120 ......... lub

1,2*(1),3*(2*1),4*(3*2*1,5*(4*3*2*1)

Krok=wielokrotność przez ostatni węzeł

Po kroku co muszę dostać się do następnego węzła,abstract 1

Ok

function =

n*f(n-1) 

its 2 steps process
from a-->to step--->b

Miałem nadzieję, że ta pomoc, po prostu pomyśl o 2 thniks, nie jak dostać się z węzła do węzła, ale node-- > step-- > node

Node-- > step jest ciałem funkcji krok-- > węzeł jest argumentem innej funkcji

Bye:) hope i helped

 -2
Author: user1885941,
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
2012-12-07 16:22:21