Bỏ qua

Chuỗi nhị phân

Tóm lược nội dung

Bài này trình bày cách giải bài toán liệt kê chuỗi nhị phân bằng phương pháp quay lui.

Bài toán

Yêu cầu:

Viết chương trình liệt kê tất cả các chuỗi nhị phân có số lượng ký tự cho trước.

Đầu vào:

Số nguyên dương \(n\) biểu thị số ký tự của chuỗi nhị phân cần phát sinh.

Đầu ra:

Các chuỗi nhị phân có \(n\) ký tự.

Bộ kiểm thử:

Đầu vào Đầu ra
n = 3 000
001
010
011
100
101
110
111

Cách giải đề xuất

Ý tưởng chính

1. Đặt:

  • binary_option là mảng biểu thị cho một phương án chuỗi nhị phân. Từng vị trí trong binary_option sẽ được thử nạp số 0 hoặc số 1.
  • binary_strings là mảng kết quả gồm các chuỗi hoàn chỉnh sẽ được in ra.

Phương pháp quay lui được thực hiện như sau:

Bước 1: Thử

Thử nạp một trong hai số 0 hoặc 1 vào binary_option: binary_option.append(digit).

Bước 2: Tiến

Gọi đệ quy để tiếp tục nạp chữ số 0 hoặc 1 ở vị trí tiếp theo cho đến khi đủ n chữ số: len(binary_option) == n.

Bước 3: Quay lui

Gỡ bỏ số vừa nạp ở cuối ra khỏi binary_option: binary_option.pop().

Ví dụ:
Tại ví trị i của binary_option, nếu bước trước đó đã nạp 0 thì gõ bỏ 0 để chuẩn bị nạp 1.

Hình dưới đây minh hoạ phương pháp quay lui khi chọn 01 cho chuỗi nhị phân gồm 3 ký tự.

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]

2. Với số ký tự n = 3, số chuỗi nhị phân sẽ được tạo ra là: \(2^n = 2^3 = 8\).

Viết chương trình

1. Viết hàm generate_binary_string() dùng để phát sinh chuỗi nhị phân.

Hàm có một tham số là mảng binary_option biểu thị một phương án chuỗi nhị phân.

Hàm không có giá trị trả về.

# Hàm quay lui dùng để phát sinh chuỗi nhị phân
def generate_binary_string(binary_option):
    if len(binary_option) == n:
        # Nếu đã đủ số lượng thì ghép các phần tử của binary_option thành một chuỗi
        s = ''.join(map(str, binary_option))

        # Lưu chuỗi nhị phân hoàn chỉnh vào biến kết quả
        binary_strings.append(s)
        return

    # Duyệt các lựa chọn: 0 và 1
    for digit in [0, 1]:
        # Bước 1 - Thử: nạp số được chọn vào phương án
        binary_option.append(digit)

        # Bước 2 - Tiến: gọi đệ quy để nạp số ở vị trí tiếp theo
        generate_binary_string(binary_option)

        # Bước 3 - Quay lui: gỡ bỏ số vừa nạp ở cuối
        binary_option.pop()

2. Viết chương trình chính:

  • Cho người dùng nhập số lượng ký tự của chuỗi nhị phần cần phát sinh.
  • Khởi tạo mảng kết quả binary_strings là rỗng.
  • Khởi tạo phương án init_option là rỗng, dùng để truyền vào lời gọi hàm generate_binary_string().
  • Gọi hàm generate_binary_string() ra thực hiện.
  • Dùng vòng lặp để in ra các chuỗi nhị phân hoàn chỉnh có trong binary_strings.
if __name__ == '__main__':
    # Số lượng ký tự của chuỗi nhị phân
    n = int(input('Nhập số ký tự: '))

    # Khởi tạo mảng kết quả binary_strings
    binary_strings = []

    # Khởi tạo phương án rỗng
    init_option = []

    # Gọi hàm generate_binary_string()
    generate_binary_string(init_option)

    # In ra các chuỗi nhị phân trong mảng kết quả binary_strings
    for s in binary_strings:
        print(s)

Mã nguồn

Code đầy đủ được đặt tại: