Bốn lựa chọn ở mỗi vị trí
Bài toán dùng các kí hiệu nucleotit A,T,G,X để biểu diễn một đoạn mạch đơn ADN dài n. Trong mô hình sinh dãy của bài, mỗi vị trí được chọn một trong bốn kí tự; cùng kí tự có thể xuất hiện ở nhiều vị trí, như AA hoặc TT.
Giống bản nhị phân tạo sẵn, khởi tạo A có n chỗ rồi gán lần lượt từng vị trí. Tới k==n thì đã có một dãy đủ độ dài. Số kết quả là $4^n$, tăng nhanh nên thực hành với n nhỏ.
Giữ cùng mô hình, thay bảng kí tự
```python
def genDNASection(A, k, n, as_string=False):
global count
if k == n:
print(''.join(A) if as_string else A)
count += 1
else:
for value in 'ATGX':
A[k] = value
genDNASection(A, k + 1, n, as_string)
```
Đặt count=0 trước khi gọi genDNASection(['']*n,0,n). Mặc định hàm in danh sách các kí tự. Nếu tham số as_string=True thì tại lá dùng ''.join(A) để in xâu liền nhau; hai kiểu xuất có cùng các lựa chọn và số nghiệm.
Với n=1, nhận A,T,G,X. Với n=2, có 16 kết quả, bắt đầu AA,AT,AG,AX rồi tới các nhánh bắt đầu T,G,X; kết thúc XX. Dãy tạo sẵn chỉ gán đè nên không cần pop.
Đối chiếu dạng danh sách và dạng xâu
Chạy tại thư mục chứa tệp:
```text
python3 g11-cs-thuc-hanh-quay-lui.py adn 2
python3 g11-cs-thuc-hanh-quay-lui.py adn-xau 2
```
Bản đầu in dạng ['A','A']; bản sau in AA. Cả hai cần có 16 nghiệm, mỗi nghiệm đúng hai phần tử/kí tự thuộc ATGX, không lặp dãy. Với n=0, có một dãy rỗng: bản danh sách in [], bản xâu có một dòng trống.
SGK khuyên dùng n nhỏ hơn 10 khi thử; tệp thực hành giới hạn n<=6 để xuất tối đa 4096 nghiệm. Đây là giới hạn chạy thử, không phải giới hạn toán học của mô hình.
Bài luyện
Dãy AA có được sinh với n=2 không?
Còn nhiều lựa chọn khác ngoài AT.
Cần giữ đủ hai vị trí.
Mô hình ADN ở đây cho phép lặp kí tự ở các vị trí khác nhau.
Đó là ràng buộc của bài hoán vị khác.
Lời giải
Vị trí đầu chọn A, vị trí thứ hai vẫn có đủ bốn lựa chọn và có thể chọn A. Vì vậy AA là một nghiệm dài 2.
Bài luyện
Với n=2, số dãy trên ATGX là bao nhiêu?
4 là số lựa chọn tại một vị trí.
Không chỉ có hai lựa chọn ở vị trí sau.
24 là số hoán vị của bốn phần tử phân biệt.
Hai vị trí, mỗi vị trí có bốn lựa chọn.
Lời giải
Hai lựa chọn vị trí độc lập cho 4×4=16 dãy. Các dãy có kí tự lặp vẫn được tính.
Bài luyện
Chuyển từ in A sang in ''.join(A) khi A chứa kí tự làm thay đổi gì?
Các nhánh sinh không đổi, chỉ ghép kí tự khi xuất.
Vẫn xét đủ mọi lựa chọn của các vị trí.
join giữ đủ các kí tự theo thứ tự.
Bảng ATGX vẫn được giữ.
Lời giải
Thay cách in ở lá không đổi các bước chọn trong cây. Kết quả được nối liền thành xâu thay vì hiển thị dấu ngoặc/dấu phẩy của danh sách.
Đang học