Cố định lần lượt từng vị trí
```python
def genPolynomials(coefs, k):
global count
if k == len(coefs):
if coefs and coefs[0] != 0:
print(format_polynomial(coefs))
count += 1
return
used = []
for i in range(k, len(coefs)):
if coefs[i] in used:
continue
used.append(coefs[i])
coefs[k], coefs[i] = coefs[i], coefs[k]
genPolynomials(coefs, k + 1)
coefs[k], coefs[i] = coefs[i], coefs[k]
```
Ở đầu mức k, các vị trí trước k đã cố định; phần từ k tới cuối còn chờ sắp. Mỗi lần đổi coefs [k] với một vị trí i trong phần còn lại để chọn hệ số cho chỗ k. Gọi đệ quy xử lí k+1 rồi đổi lại đúng hai vị trí để khôi phục dãy.
used là danh sách các **giá trị đã thử tại riêng mức này**. Nếu đã thử cùng một giá trị cho vị trí k thì bỏ lựa chọn lặp ấy. Mức đệ quy sau có used mới nên vẫn dùng được lần xuất hiện khác của cùng giá trị. Không dùng quy tắc “hệ số chưa có trong toàn tiền tố” khi đầu vào có hệ số trùng.
Tại k==len(coefs), chỉ in khi hệ số đầu khác 0. Hàm format_polynomial của bài trước đổi dãy hệ số thành biểu thức. Sau khi lời gọi gốc kết thúc, dãy đầu vào được khôi phục như trước.
Hai hệ số bằng nhau vẫn cần được dùng đủ
Với [2,2,−1], có ba dãy hệ số khác nhau:
| Dãy hệ số | Đa thức |
|---|---|
| [2,2,−1] | $2x^2+2x-1$ |
| [2,−1,2] | $2x^2-x+2$ |
| [−1,2,2] | $-x^2+2x+2$ |
Mỗi nghiệm có đủ hai hệ số 2. Hai cách đổi chỗ hai lần xuất hiện của số 2 không tạo đa thức mới, nên không in lại. Với [1,1,0], ba hoán vị giá trị chỉ còn hai nghiệm bậc 2 vì [0,1,1] bị loại.
Kiểm số lượng, hệ số và bậc
Chạy:
```text
python3 g11-cs-thuc-hanh-quay-lui.py da-thuc 3 0 -2
python3 g11-cs-thuc-hanh-quay-lui.py da-thuc 2 2 -1
```
Lệnh đầu cho bốn đa thức bậc 2; lệnh sau cho ba đa thức trong bảng. Với hệ số đều 0, không có nghiệm đúng bậc yêu cầu nên tổng số nghiệm là 0. Một hệ số khác 0 cho đa thức hằng bậc 0.
Mỗi nghiệm cần giữ cùng các giá trị hệ số và đủ số lần xuất hiện như đầu vào; hệ số đầu khác 0, không in lặp dãy hệ số. Tệp tải nhận tối đa 7 hệ số để thực hành. Dùng số âm như ví dụ và thử cả 0.0,1.0 để kiểm theo giá trị số.
Bài luyện
Vì sao phải đổi lại coefs [k] và coefs [i] sau lời gọi nhỏ?
Mỗi nghiệm vẫn cần đủ các hệ số.
Điều này sẽ làm các nhánh sau nhận trạng thái khác dự kiến.
Dấu hệ số không do thao tác đổi chỗ quyết định.
Hai lần đổi cùng cặp vị trí khôi phục trạng thái.
Lời giải
Lần đổi trước chọn hệ số cho vị trí k. Sau khi xử lí xong nhánh ấy, đổi ngược đúng cặp vị trí đưa dữ liệu về như lúc bắt đầu để thử i khác.
Bài luyện
Vì sao used phải riêng cho từng mức đệ quy?
Cần giữ đúng cả số lần xuất hiện của hệ số trùng.
Bài cho phép các hệ số nhập trùng nhau.
Như vậy có thể không sinh đủ vị trí của nghiệm.
used kiểm giá trị đã thử, không kiểm dấu.
Lời giải
Hai số 2 trong đầu vào đều phải được dùng. Trùng lựa chọn ở cùng mức chỉ sinh cùng nhánh; ở mức sau vẫn cần chọn số 2 còn lại. Vì vậy danh sách đã thử phải thuộc riêng từng mức.
Bài luyện
Với hệ số [1,1,0], có bao nhiêu đa thức đúng bậc 2 khác nhau?
Có hệ số 1 làm hệ số đầu khác 0.
Hai dãy hợp lệ là [1,1,0] và [1,0,1].
Dãy [0,1,1] không còn bậc 2.
Hoán đổi hai số 1 không tạo dãy giá trị mới.
Lời giải
Ba hoán vị giá trị khác nhau gồm [1,1,0],[1,0,1],[0,1,1]. Loại dãy bắt đầu 0, còn hai đa thức đúng bậc 2.
Bài luyện
Nếu mọi hệ số nhập đều 0, cần có bao nhiêu nghiệm đúng bậc k theo yêu cầu hệ số đầu khác 0?
Độ dài dãy không tạo một hệ số khác 0.
Các lần đổi chỗ không đổi được giá trị hệ số.
Không thể có hệ số đầu khác 0.
Biểu thức 0 không đạt điều kiện đúng bậc đang dùng.
Lời giải
Mọi hoán vị vẫn có hệ số đầu 0. Điều kiện cần để là đa thức đúng bậc k không thỏa, nên không in nghiệm và tổng bằng 0.
Đang học