Dãy đã có đủ n chỗ từ đầu
```python
def genBinary_fixed(A, k, n):
global count
if k == n:
print(A)
count += 1
else:
for value in range(2):
A[k] = value
genBinary_fixed(A, k + 1, n)
```
Trước khi gọi, đặt count=0, tạo A=[0]*n rồi gọi genBinary_fixed(A,0,n). Tại k, các vị trí trước k đã được chọn; vòng for thử 0 rồi1 và gán vào A[k]. Lời gọi với k+1 chọn vị trí tiếp theo.
Khi k==n, mọi vị trí đã có giá trị nên in A, tăng count đúng một lần và không truy cập A[n]. n được truyền rõ vào hàm; count là biến đếm toàn cục được khai báo global như cách đếm nghiệm trong sách.
Không cần xóa chỗ đã cấp sẵn
Với n=2, chương trình in lần lượt:
```text
[0, 0]
[0, 1]
[1, 0]
[1, 1]
```
Sau mỗi lời gọi nhỏ, quay về vòng thử. Dãy vẫn có độ dài n; lựa chọn mới ghi đè vào đúng vị trí, không thêm phần tử nên không cần pop. Lệnh pop ở bản này sẽ làm mất chỗ cần dùng.
Chạy chế độ co-dinh với 2 trong tệp tải. Kiểm đủ bốn dãy và dòng tổng số nghiệm4. Với n=0, cơ sở đúng ngay và in[]một lần, tương ứng một dãy rỗng.
Bài luyện
Tại sao kiểm k==n trước khi gán A[k]?
Điều kiện này kiểm độ dài đã chọn, không đổi giá trị.
Các chỉ số hợp lệ của dãy dài n là 0…n−1.
Nghiệm vẫn giữ đủ n phần tử.
n có thể khác1.
Lời giải
k đếm số vị trí đã chọn. Khi k==n, vị trí0 đến n−1 đã đủ và A[n]nằm ngoài dãy; cần xử lí nghiệm tại cơ sở.
Bài luyện
Vì sao bản tạo sẵn A=[0]*n không cần pop sau lời gọi nhỏ?
pop là phương thức của danh sách.
Không phải cách dùng dãy tạo sẵn.
Độ dài dãy giữ nguyên khi thử giá trị khác.
Bản thêm dần cần bỏ phần tử vừa thêm.
Lời giải
Mỗi vị trí đã có từ đầu. Lần thử tiếp gán giá trị mới vào A[k], các vị trí sau được chọn lại trước khi tới lá. pop sẽ làm thay đổi độ dài và mất vị trí cần gán.
Bài luyện
Bản này với n=2 có bao nhiêu nghiệm?
2 là số lựa chọn tại một vị trí.
Còn thiếu một trong bốn dãy.
8 là số dãy nhị phân dài3.
Hai vị trí, mỗi vị trí có hai lựa chọn, nên2²=4.
Lời giải
Cây có hai mức chọn; bốn dãy00,01,10,11 đều hợp lệ, nên số nghiệm4.
Đang học