https://your-app-link.streamlit.app
Bài toán Vạch Thước được mô tả như sau:
Cho một cây thước có độ dài
L
và một chiều cao vạch lớn nhấth
. Hãy vẽ các vạch trên thước theo quy tắc đệ quy sau:
- Vẽ một vạch có chiều cao
h
ở chính giữa cây thước.- Với mỗi nửa còn lại của cây thước, lặp lại quy trình trên với chiều cao vạch giảm đi 1 (
h-1
).- Quá trình dừng lại khi chiều cao vạch bằng 0.
Kết quả sẽ là một cây thước quen thuộc với các vạch dài ở giữa, và các vạch ngắn dần khi chia nhỏ các khoảng.
Thuật toán Chia để Trị là một cách tiếp cận tự nhiên và thanh lịch để giải quyết bài toán này. Ý tưởng được chia thành ba bước:
-
Divide (Chia): Tại mỗi bước, chia đoạn thước
[left, right]
hiện tại thành hai đoạn con bằng nhau:[left, mid]
và[mid, right]
, vớimid
là điểm giữa. -
Conquer (Trị): Giải quyết "bài toán" đơn giản nhất tại bước hiện tại: vẽ một vạch tại điểm
mid
với chiều caoh
tương ứng. -
Combine (Kết hợp): Gọi đệ quy để giải quyết hai bài toán con trên hai đoạn
[left, mid]
và[mid, right]
với chiều cao vạch được giảm đi 1 (h-1
). Trong bài toán này, bước kết hợp không tường minh; kết quả cuối cùng là tập hợp của tất cả các vạch được vẽ trong toàn bộ quá trình đệ quy.
Hàm đệ quy sẽ có dạng như sau:
def draw_ruler(left, right, height):
# Điều kiện dừng
if height <= 0:
return
# Conquer: Vẽ vạch ở giữa
mid = (left + right) / 2
draw_tick(mid, height)
# Divide: Gọi đệ quy cho 2 nửa
draw_ruler(left, mid, height - 1)
draw_ruler(mid, right, height - 1)