Tui nghĩ 1 cách viết là chia làm 4 phần:
1) đổi biểu thức dạng chuỗi sang dạng cây nhị phân
Ví dụ:
Code:
(y-x)(x+y)
sẽ trở thành cây nhị phân:
*
/ \
- +
/ \ / \
y x x y
2) Duyệt cây để lấy đạo hàm theo các quy tắc đã biết => tạo ra 1 cây cho đạo hàm:
a) gặp nút '*': ứng với (L * R) => xài qui tắc (L'*R + R'*L)
b) gặp nút '+': ứng với (L + R) => xài qui tắc (L' + R')
c) gặp nút '-': ứng với (L - R) => xài qui tắc (L' - R')
Ví dụ:
Code:
cây ứng với biểu thức "(y-x)(x+y)" sẽ cho ra cây đạo hàm:
+
/ \
* *
/ \ / \
- + - +
/\ /\ /\ /\
0 1 x y y x 0 1
(ứng với biểu thức: -(x+y) + (y-x))
3) rút gọn cây đạo hàm
Ví dụ:
Code:
Cây đạo hàm trên có thể rút gọn lại thành:
-
/ \
0 *
/\
2 x
(ứng với: -2x)
4) Duyệt cây đạo hàm và đổi ra dạng chuỗi
Ví dụ với cây đạo hàm trên thì sẽ có chuỗi: "-2x"
Phần 2 (-> cây đạo hàm) có vẻ khó nhưng mình đã có các qui tắc lấy đạo hàm trong sách
Nếu không cần in biểu thức đạo hàm ra cho người dùng coi mà chỉ cần có đạo hàm để tính toán tiếp thì có thể bỏ qua phần 3 (rút gọn cây). Phần 3 thì phải dựa trên kinh nghiệm để có danh sách các qui tắc rút gọn, đại khái:
0+x = x
1*x = x
mx+nx = (m+n)x
xy = yx
......................
(có gì sai sót mong được góp ý; xin cám ơn)
-thân