Categories: Tài liệu IT

12. Tháp Hà Nội

Published by

Chắc hẳn bạn đã từng nghe về trò chơi “Tháp Hà Nội” – một trong những bài toán nổi tiếng nhất trong lĩnh vực đệ quy. Trò chơi này đòi hỏi sự khéo léo và sáng tạo để di chuyển một ngọn tháp gồm nhiều đĩa từ một cọc sang một cọc khác. Tuy đơn giản nhưng giải pháp cho trò chơi này lại không hề dễ dàng.

Nguyên Tắc Trò Chơi

Trò chơi “Tháp Hà Nội” gồm ba que di chuyển. Trên mỗi que được xếp chồng từ trên xuống dưới theo thứ tự giảm dần về kích thước đĩa, tức là đĩa lớn nhất ở dưới cùng và đĩa nhỏ nhất ở trên cùng. Các đĩa tạo thành một ngọn tháp hình nón.

Mục tiêu của trò chơi là di chuyển toàn bộ ngọn tháp từ một que sang que khác.

Các quy tắc sau phải được tuân thủ:

  • Chỉ được di chuyển một đĩa mỗi lần.
  • Chỉ có thể di chuyển đĩa trên cùng của một que.
  • Đĩa trên cùng có thể được đặt lên một que khác nếu que đó trống hoặc đĩa trên cùng của que đó có kích thước lớn hơn đĩa đang di chuyển.

Số Lần Di Chuyển

Số lần di chuyển cần thiết để di chuyển một ngọn tháp gồm n đĩa có thể được tính bằng công thức: 2^n – 1.

Chương Trình Python Đệ Quy

Dưới đây là một đoạn mã Python đơn giản để giải trò chơi Tháp Hà Nội bằng phương pháp đệ quy:

def hanoi(n, source, helper, target):
    if n > 0:
        # Di chuyển một ngọn tháp có n-1 đĩa từ que gốc sang que trung gian
        hanoi(n - 1, source, target, helper)

        # Di chuyển đĩa lớn nhất từ que gốc sang que đích
        if source:
            target.append(source.pop())

        # Di chuyển ngọn tháp từ que trung gian sang que đích
        hanoi(n - 1, helper, source, target)

Hàm hanoi là một hiện thực của thuật toán được giới thiệu ở trên. Đầu tiên, chúng ta di chuyển một ngọn tháp có kích thước n-1 từ que gốc sang que trung gian bằng cách gọi đệ quy hanoi(n - 1, source, target, helper).

Sau đó, chỉ còn lại đĩa lớn nhất trên que gốc. Chúng ta di chuyển đĩa này sang que đích bằng cách sử dụng câu lệnh if source: target.append(source.pop()).

Cuối cùng, chúng ta di chuyển ngọn tháp từ que trung gian sang que đích bằng cách gọi đệ quy hanoi(n - 1, helper, source, target).

Trên đây là một giải pháp đệ quy để di chuyển một ngọn tháp có kích thước n. Thuật toán này sẽ kết thúc sau một số lần đệ quy hữu hạn, vì mỗi lần đệ quy sẽ làm giảm kích thước của ngọn tháp đi 1. Cuối cùng, chúng ta sẽ đạt được một ngọn tháp có kích thước n = 1, tức là chỉ việc di chuyển đĩa đơn giản.

Nếu bạn muốn xem các bước di chuyển trong quá trình đệ quy, bạn có thể chạy đoạn mã Python sau đây:

def hanoi(n, source, helper, target):
    if n > 0:
        # Di chuyển một ngọn tháp có n-1 đĩa từ que gốc sang que trung gian
        hanoi(n - 1, source, target, helper)

        # Di chuyển đĩa lớn nhất từ que gốc sang que đích
        if source:
            target.append(source.pop())

        # Di chuyển ngọn tháp từ que trung gian sang que đích
        hanoi(n - 1, helper, source, target)

source = [3, 2, 1]
helper = []
target = []

hanoi(len(source), source, helper, target)

Chúng ta đã thay đổi cấu trúc dữ liệu một chút. Thay vì chỉ truyền các ngăn xếp đĩa vào hàm, chúng ta truyền các bộ ba (tuple) vào hàm. Mỗi bộ ba bao gồm ngăn xếp và tên của ngăn xếp đó.

Hy vọng rằng bạn đã hiểu về trò chơi “Tháp Hà Nội” và sự quyến rũ của nó. Hãy thử phát triển một chương trình Python để giải trò chơi này và tận hưởng cảm giác thành công khi hoàn thành nhiệm vụ!

This post was last modified on Tháng Năm 10, 2024 2:58 chiều

Đinh Thái Hoàng

Đinh Thái Hoàng - tác giả của Laptrinhc.edu.vn, chuyên sâu trong lĩnh vực lập trình. Trang web chia sẻ kiến thức, hướng dẫn và tin tức về lập trình, giúp bạn khám phá thế giới mã nguồn và nâng cao kỹ năng coder.

Published by

Bài đăng mới nhất

Tổng hợp app bán hàng online uy tín nhất tại Việt Nam

Tổng hợp app bán hàng online uy tín nhất tại Việt Nam

Khám phá và tận dụng tiềm năng kinh doanh trên nhiều nền tảng là điều…

5 ngày ago

HỌC THIẾT KẾ MOBILE APP Ở ĐÂU UY TÍN?

Mobile App đang trở thành một phần thiết yếu trong cuộc sống hiện đại. Với…

5 ngày ago

Cách phá mật khẩu Windows bằng DLC Boot

Bạn đã bao giờ quên mật khẩu máy tính và không biết phải làm sao?…

5 ngày ago

Cách kiểm tra và cài đặt Driver cho Windows 10 chuẩn nhất

Driver chính là phần mềm giúp hệ điều hành nhận diện phần cứng trên máy…

5 ngày ago

Top 10 công cụ viết phần mềm tốt nhất

Hiện nay, lập trình viên không cần phải thực hiện toàn bộ công việc lập…

5 ngày ago

Những Công Ty Lập Trình Ứng Dụng Cho IOS Hàng Đầu Việt Nam

Lập trình ứng dụng cho iOS không chỉ đơn thuần là một quyết định khó…

5 ngày ago