2012-09-18 5 views
2

나는이 하노이 타워의 재귀 알고리즘을 이해하는 문제가 오전 :하노이 타워의 재귀 알고리즘

public class MainClass { 
    public static void main(String[] args) { 
    int nDisks = 3; 
    doTowers(nDisks, 'A', 'B', 'C'); 
    } 

    public static void doTowers(int topN, char from, char inter, char to) { 
    if (topN == 1){ 
     System.out.println("Disk 1 from " + from + " to " + to); 
    }else { 
     doTowers(topN - 1, from, to, inter); 
     System.out.println("Disk " + topN + " from " + from + " to " + to); 
     doTowers(topN - 1, inter, from, to); 
    } 
    } 
} 

출력은 다음과 같습니다

Disk 1 from A to C 
Disk 2 from A to B 
Disk 1 from C to B 
Disk 3 from A to C 
Disk 1 from B to A 
Disk 2 from B to C 
Disk 1 from A to C 

나는 우리가 어떻게해야합니까 방법을 이해하지 않습니다

Disk 1 from C to B 
Disk 3 from A to C 
Disk 1 from B to A 

누군가 설명해 주시겠습니까?

감사합니다.

+1

여기의 핵심 개념은 인수를 변경하는 재귀 호출을 이해하는 것입니다. – gtgaxiola

+0

예,하지만 A에서 B로 A에서 C 디스크 2로 디스크 1이 어떻게 왔는지는 이해하지만 어떻게 든 이해할 수 없습니다. 디스크 1이 C에서 B로 바뀌 었습니다. 그 흐름을 설명해 주시겠습니까? 나는 정말로 그것을 바르게 평가할 것이다! – user564927

+2

'doTowers (nDisks,'A ','B ','C ');를 doTowers (nDisks,'Left ','Right ','Middle ')로 변경하고 시각화하는 데 도움이되는지 확인하십시오. – Shmiddty

답변

9

페그 A에서 C로 N 디스크 타워를 이동하는 것은 N-1 (모든 디스크를 제외하고 모든 디스크를 마지막으로) 타워를 A에서 B로 이동 한 다음 N 번째 디스크를 A에서 C로 이동하고 마지막으로 타워는 이전에 B에서 B로 옮겼습니다. 이것은 하나 이상의 디스크가있는 타워가 움직일 때마다 적용됩니다. 1 개의 디스크 타워의 경우에는 디스크 만 움직입니다.

0

만약 내가 틀린 것이 아니라면 각 디스크 1 개를 1 페그만큼 움직일 수 있습니까? 첫 번째 디스크를 a에서 b로 이동 한 다음 b에서 b로 이동합니다. 그것은 2 움직임입니다. 이제 디스크 2를 a에서 b로 이동할 수 있습니다. 이제 디스크 1을 c에서 b로 이동할 수 있습니다. 지금 디스크 3은 A에 있고 디스크 2와 1은에 있습니다. 이제 디스크 1을 a에서 b로 c에서 c로 이동합니다. 우리는 올바른 순서로 디스크 1과 디스크 2를 디스크 3에 가져와야합니다. 그래서 우리는 디스크 1을 B에서 A로 옮깁니다. 이렇게하면 디스크 2를 B에서 C로 옮길 수 있습니다. 이제 디스크 1을 a에서 b로, 그리고 나서 c로 끝내면 작업이 완료됩니다.

질문에 대한 답변이 있습니까?

+0

전체 작업을 이해했습니다. ...하지만 내가 recursivly 재결합하려고 할 때 내가 얻을 모든 것을 깨닫고 때 A에서 C로 디스크 2에 A에서 B로, 디스크 2에서 B로 C 디스크 1에 C에서 내가 어떻게 든 이해할 수 없다 recursive 함수가 C에서 B로 디스크 1을 얻은 방법 A에서 C로 디스크 1에서 B에서 A로 : ( – user564927