Đã thử một hướng, còn phải biết quay về
Trong ví dụ mê cung, tại một chỗ rẽ có thể có nhiều hướng. Thử một hướng khả thi để đi tiếp; nếu không tới được đích theo hướng ấy, quay lại chỗ rẽ còn lựa chọn khác để thử. Cần giữ thông tin về trạng thái đang xét và khôi phục phần thay đổi khi quay về.
Đây là ý tưởng quay lui (backtracking). Đệ quy diễn tả bước đi tiếp: từ trạng thái hiện tại gọi cùng thủ tục với trạng thái đã mở rộng. Khi lời gọi nhỏ kết thúc, chương trình trở về chỗ gọi và có thể thử lựa chọn kế tiếp.
Tìm một nghiệm có thể dừng khi đã thấy; tìm tất cả cần tiếp tục các nhánh còn lại. Hết lựa chọn khả thi ở một trạng thái thì lời gọi ấy kết thúc để trở về mức trước, không phải luôn kết thúc toàn bộ chương trình.
Một dãy đang chọn là một trạng thái
Với bài toán tạo dãy, trạng thái là phần đã chọn, còn gọi là tiền tố. Ban đầu phần này rỗng. Ở bước k, đã chọn k phần tử và đang chọn phần tử kế tiếp.
Miền D_k chứa các giá trị có thể dùng cho vị trí k. Từ tiền tố hiện tại, chọn tập S_k các giá trị còn khả thi để mở rộng. Nếu không có giá trị nào thì quay về; nếu đã đủ yêu cầu thì ghi nhận nghiệm. Thứ tự thử trong S_k giúp theo dõi thứ tự kết quả.
Với dãy nhị phân không có ràng buộc bổ sung, mỗi vị trí đều chọn 0 hoặc 1, nên S_k vẫn là[0,1]. Quay lui không tự làm số nghiệm ít đi: tìm tất cả dãy dài n vẫn có $2^n$ nghiệm.
Theo dõi cây chọn hai vị trí
Hình ghi phần đã chọn ở mỗi nút. Từ[]thử 0 trước, rồi ở vị trí tiếp theo thử 0 và 1, tạo[0,0],[0,1]. Quay về mức đầu để thử 1 rồi tiếp tục tạo[1,0],[1,1]. Bốn lá là bốn kết quả đủ hai vị trí.
Một nhánh từ gốc tới lá tương ứng một chuỗi lựa chọn. Khi hoàn thành nhánh[0,0], thuật toán quay về để thử lựa chọn kế tiếp ở cùng vị trí, không cần bắt đầu lại mọi công việc từ đầu.
Bài luyện
Khi tìm tất cả nghiệm, đã ghi nhận một nghiệm thì cần làm gì?
Kết quả hợp lệ đã tìm cần được giữ hoặc xuất.
Nghiệm phải thỏa điều kiện hoàn thành.
Một nghiệm chưa đủ cho yêu cầu tất cả.
Đó là cách dừng cho yêu cầu một nghiệm.
Lời giải
Sau khi ghi nhận một nghiệm, lời gọi hiện tại quay về để các vòng thử tiếp tục. Chỉ khi xét hết các khả năng cần thiết mới đủ toàn bộ nghiệm.
Bài luyện
Trong cây hai vị trí, sau[0,0]là kết quả nào khi thử 0 trước1?
Còn nhánh[0,1]trước khi đổi vị trí đầu.
Còn các nhánh chưa xét trước đó.
Đã vượt độ dài hai vị trí.
Giữ lựa chọn 0 đầu và đổi lựa chọn vị trí thứ hai sang 1.
Lời giải
Hoàn thành[0,0]rồi quay về mức chọn vị trí thứ hai. Lựa chọn kế tiếp là 1, nên nhận[0,1].
Bài luyện
Hết lựa chọn khả thi ở một lời gọi đệ quy có nghĩa gì?
Mức trước có thể vẫn còn lựa chọn khác.
Đây chỉ là kết thúc một lời gọi.
Một nhánh không đi tiếp chưa loại mọi nhánh khác.
Chưa suy ra điều đó chỉ từ một mức hết lựa chọn.
Lời giải
Vòng thử của mức hiện tại đã hết thì hàm trả về nơi gọi. Các mức phía trước tiếp tục lựa chọn chưa thử nếu còn; đó là quá trình quay lui.
Đang học