Chỉ số hệ số ứng với số mũ
Danh sách A=[a0,a1,...,an] lưu hệ số theo **số mũ tăng dần**. A[0] là hệ số tự do, A[1] đi với x, A[2] đi với $x^2$.
Ví dụ A=[2,−3,4] biểu diễn $F(x)=2-3x+4x^2$. Tại x=2, giá trị là $2-3\times2+4\times2^2=12$. Không đọc A theo thứ tự hệ số của cách viết $4x^2-3x+2$ từ trái sang phải, vì quy ước danh sách đã gắn chỉ số với số mũ.
Bớt hạng tử có số mũ lớn nhất đang xét
F(A,x,k) tính phần đa thức từ hệ số A[0] tới A[k]. Điều kiện là A không rỗng và 0≤k<len(A). Với k=0, chỉ còn hệ số tự do A[0]. Với k>0, cộng hạng tử $A[k]x^k$ vào kết quả phần trước:
```python
def F(A, x, k):
if k == 0:
return A[0]
return A[k] * (x ** k) + F(A, x, k - 1)
```
Gọi `F(A,x,len(A)-1)`. Với A=[2,−3,4] và x=2:
| k | Kết quả phần đa thức |
|---|---|
| 0 | 2 |
| 1 | −3×2+2=−4 |
| 2 | 4×4+(−4)=12 |
Khi x=0, kết quả là A[0]. Khi A chỉ có một hệ số, hàm trả ngay hệ số ấy ở mọi x. Dãy hệ số rỗng phải được chặn trước lời gọi; không có A[0] để dùng cơ sở.
Chạy bộ thực hành và đối chiếu kết quả
Tải mã luyện tập, mở terminal tại thư mục chứa tệp và chạy bằng Python3:
```text
python3 g11-cs-luyen-tap-de-quy.py 13
```
Cần nhận xâu nhị phân 1101, danh sách [1,1,0,1] và giá trị đổi lại 13. Tệp có hàm decimal(s,n) tính giá trị n kí tự đầu theo công thức đã học; bộ mẫu dùng nó trên xâu 0/1 hợp lệ vừa tạo. Dãy [4,1,4,2] phải giữ nguyên sau khi đếm; hai bản đếm đều cho 3. Đa thức hệ số [2,−3,4] tại x=2 phải cho 12.
Chạy lại với 0 để kiểm xâu `'0'`, danh sách [0] và giá trị đổi lại 0. Mẫu nhận n từ 0 đến 4095 để giữ dữ liệu thử nhỏ; nhập số âm, chữ hoặc số ngoài mẫu phải báo lỗi.
Phần sắp xếp chèn dùng lại hàm sap_xep_chen trong tệp thiết kế đệ quy đã có: thử A=[4,1,4,2], gọi với k=len(A)−1, cần nhận A=[1,2,4,4]. Thử thêm rỗng, một phần tử, đã xếp và thứ tự giảm. Đây là thao tác sửa A tại chỗ; đếm nghịch đảo của dữ liệu gốc trước khi sắp xếp nếu cần giữ kết quả đếm.
Đệ quy giúp cách viết bám sát quy tắc dùng bài toán nhỏ hơn, như chuyển chồng đĩa hoặc tổng hợp phần đầu. Tuy nhiên, chương trình có chi phí gọi hàm và giới hạn độ sâu; những phần tính lặp lại cũng có thể làm tăng công việc. Cần xét thuật toán và dữ liệu cụ thể khi so sánh với vòng lặp, thay vì kết luận tốc độ chỉ từ độ ngắn của mã.
Bài luyện
Với quy ước hệ số trong bài, A=[2,−3,4] biểu diễn đa thức nào?
A[0] là hệ số tự do, A[1] ứng với x và A[2] ứng với x².
Đã đọc ngược thứ tự hệ số.
Chỉ số bắt đầu từ 0 nên phần tử đầu không đi với x.
Hai hệ số sau còn phải nhân với các lũy thừa của x.
Lời giải
Theo chỉ số, A[0]=2 là hệ số tự do; A[1]=−3 nhân x; A[2]=4 nhân x². Vì vậy đa thức là 2−3x+4x².
Bài luyện
F([2,−3,4],2,2) trong bài trả về bao nhiêu?
2 là hệ số tự do, chưa tính hai hạng tử còn lại.
Hạng tử cuối 4×2² cộng với phần trước −4.
−4 mới là kết quả phần tới hệ số chỉ số 1.
16 chỉ là hạng tử cuối, chưa cộng phần trước.
Lời giải
Cơ sở trả 2. Bước k=1 cho −3×2+2=−4; bước k=2 cho 4×2²+(−4)=16−4=12.
Bài luyện
Vì sao F(A,x,0) trả A[0] khi A không rỗng?
Hệ số tự do không phụ thuộc x.
k=0 là cơ sở đã biết trực tiếp.
Không còn hạng tử có số mũ dương trong phần này.
Giá trị A[0] do dữ liệu cho, không bắt buộc bằng 0.
Lời giải
k=0 chỉ xét hệ số A[0], tức hạng tự do của đa thức. Giá trị phần này là A[0] ở mọi x, nên hàm dừng và trả đúng hệ số ấy.
Đang học