btvn.vn
Tìm kiếm Đăng nhập

Sinh dãy ADN bằng quay lui

Lưu trên thiết bị này
Chuyên đề lựa chọn CS: Kĩ thuật duyệt · Chọn bài khác

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?
Chọn một đáp án

Bài luyện

Với n=2, số dãy trên ATGX là bao nhiêu?
Chọn một đáp án

Bài luyện

Chuyển từ in A sang in ''.join(A) khi A chứa kí tự làm thay đổi gì?
Chọn một đáp án

Đang học