2013-05-11 44 views
5

Dưới đây là mã Java của tôi để giải quyết Tháp Hà Nội sử dụng đệ quy:Tháp java đệ quy Hà Nội

/**here is a stack of N disks on the first of three poles (call 
them A, B and C) and your job is to move the disks from pole A to pole B without 
ever putting a larger disk on top of a smaller disk.*/ 

public class Hanoi { 

    public static void main(String[] args) { 
     playHanoi (2,"A","B","C"); 
    } 

    //move n disks from position "from" to "to" via "other" 
    private static void playHanoi(int n, String from , String other, String to) { 
     if (n == 0) 
      return; 
     if (n > 0) 
     playHanoi(n-1, from, to, other); 
     System.out.printf("Move one disk from pole %s to pole %s \n ", from, to); 
     playHanoi(n-1, other, from, to); 
    } 

} 

Liệu nơi tôi đặt vấn đề phương pháp in? Ngoài ra, tôi có thể làm điều đó như sau:

playHanoi(n-1, from, to, other); 
    playHanoi(n-1, other, from, to); 
    System.out.printf("Move one disk from pole %s to pole %s \n ", from, to); 
+2

có đúng không ..... 'printf' trong trường hợp thứ nhất sẽ nằm giữa các cuộc gọi hàm và sau đó, sau hai hàm gọi. – Bill

+1

chạy nó và xem đầu ra để hiểu sự khác biệt .... – Bill

+0

cũng, phương pháp 1 là tốt hơn (và chính xác), vì bạn không nên di chuyển các đĩa bằng cách sử dụng phương pháp thứ hai của bạn .... nghĩ tại sao :) – Bill

Trả lời

11

Giải quyết Tower of Hanoy vấn đề theo cách này, không là gì ngoài việc xác định chiến lược về cách bạn muốn hoàn thành công việc. Và mã của bạn:

playHanoi(n-1, from, to, other); 
    System.out.printf("Move one disk from pole %s to pole %s \n ", from, to); 
    playHanoi(n-1, other, from, to); 

Về cơ bản định nghĩa chiến lược của bạn để thích dưới đây,

  1. Move n-1 đĩa từ "từ" (tháp nguồn) để " khác " (tháp trung gian).
  2. Sau đó di chuyển đĩa thứ n từ "từ" (tháp nguồn) để "thành" (tháp đích).
  3. Cuối cùng di chuyển n-1 đĩa từ (tháp trung gian) "khác" để "thành" (tháp đích).

bạn prinf cơ bản nào bước thứ .

Bây giờ nếu bạn viết mã như thế này:

playHanoi(n-1, from, to, other); 
    playHanoi(n-1, other, from, to); 
    System.out.printf("Move one disk from pole %s to pole %s \n ", from, to); 

Sau đó, bạn về cơ bản thực hiện:

  1. Move n-1 đĩa từ "từ" (nguồn tháp) đến "khác" (tháp trung gian).
  2. Sau đó di chuyển n-1 đĩa từ (tháp trung gian) "khác" để "thành" (tháp đích).
  3. Cuối cùng di chuyển đĩa thứ n từ "từ" (tháp nguồn) để "thành" (tháp đích).

    Trong chiến lược này, sau khi thực hiện bước thứ (di chuyển tất cả n-1 đĩa từ "khác" để "thành"), bước thứ cấp không hợp lệ (di chuyển n đĩa thứ từ "từ" đến "tới")! Bởi vì trong Tower of Hanoy bạn không thể đặt một đĩa lớn hơn trên một nhỏ hơn!

Vì vậy, lựa chọn tùy chọn thứ hai (chiến lược) dẫn bạn đến một chiến lược không hợp lệ, đó là lý do tại sao bạn không thể làm điều đó!

1

Nó thực sự quan trọng. Bất cứ điều gì sau khi gọi đệ quy của bạn sẽ được thực hiện sau khi đệ quy thư giãn (và bất cứ điều gì trước khi nó, trước đó), vì vậy bạn có thể tìm thấy đầu ra của bạn là một thứ tự vô nghĩa.

Hãy nhớ rằng câu lệnh sau khi cuộc gọi hàm không thực hiện cho đến khi hàm trả về.

Các vấn đề liên quan