Chuỗi nhị phân¶
Yêu cầu¶
Sử dụng kỹ thuật quay lui, viết chương trình liệt kê tất cả số nhị phân có số chữ số cho trước.
Input¶
Số nguyên dương n, là số chữ số.
Output¶
Các số nhị phân có n chữ số.
Bộ test¶
STT | Input | Output |
---|---|---|
1 | n = 3 | 000 001 010 011 100 101 110 111 |
Cách giải đề xuất¶
-
Khởi tạo
Đặt biến
binary
kiểulist
, mỗi phần tử là một chữ số0
hoặc1
, thể hiện một số nhị phân hợp lệ.Khởi tạo
binary
là danh sách rỗng. -
Lựa chọn
Lần lượt chọn chữ số
0
và chữ số1
.Ứng với mỗi chữ số
0
hoặc1
, thực hiện:- Nạp chữ số này vào
binary
tại vị trí đang xét (do biếncurrent
nắm giữ). - Gọi hàm đệ quy để tiếp tục nạp chữ số
0
hoặc1
cho vị trí tiếp theo (current + 1
). Chỗ này không cần kiểm tra hợp lệ. - Thực hiện quay lui: Xóa bỏ chữ số đã nạp ra khỏi
binary
, nhằm chuẩn bị nạp chữ số khác ở cùng vị trí.
- Nạp chữ số này vào
-
Điều kiện dừng
Khi
binary
đã đủ số lượng chữ số theo yêu cầu, thì đây là một phương án hợp lệ, ta nạp vào mảngsolutions
, là mảng chứa tất cả đáp án.
Hình 1 dưới đây thể hiện một cách tương đối kỹ thuật quay lui khi chọn các chữ số 0
và 1
cho số nhị phân gồm 3 chữ số.
flowchart TD
R[ø] --> 0[0] --> 00[0] --> 000[0]
00 --> 001[1]
0 --> 01[1] --> 010[0]
01 --> 011[1]
R[ø] --> 1[1] --> 10[0] --> 100[0]
10 --> 101[1]
1 --> 11[1] --> 110[0]
11 --> 111[1]
Hình 1. Cây mô tả cách tạo số nhị phân gồm 3 chữ số
Như vậy, hàm phát sinh số nhị phân generate_binary
được viết như sau:
Lưu ý: Do cách quản lý bộ nhớ của Python, trước khi nạp một đáp án vào mảng solutions
, ta không nạp trực tiếp binary
vào, mà phải nạp bản sao bằng cách dùng hàm copy()
.
Mã nguồn¶
-
Chương trình C++ hoàn chỉnh đặt tại Gist của GitHub
-
Chương trình Python hoàn chỉnh đặt tại Google Colab