Xây dÿng giải thuật đệ quy Khi cài đặt thuÁt toán đá quy ta tiến hành nhÿng b°ßc sau: • B°ßc 1: Xác đßnh mục đích, đầu vào và đầu ra để từ đó xác đßnh tên tiêu đề hàm tên hàm và tham số
Trang 1TR¯àNG Đ¾I HàC DUY TÂN KHOA CÔNG NGHà THÔNG TIN
Khoa: Công nghá thông tin
BÁc đào t¿o: Đ¿i hác – Cao đẳng
Đà Nẵng, tháng 01 năm 2021
Trang 2Nguyễn Thị Anh Đào Trang 1
Cấu trúc của giải thuật đệ quy
Một giải thuÁt đá quy bao giá cũng gồm 2 phần
• Phần neo: Xác đßnh điểm kết thúc cÿa một giải thuÁt đá quy Tr°áng hợp này còn đ°ợc gái là tr°áng hợp suy biến Nếu một giải thuÁt đá quy không có tr°áng hợp suy biến thì sẽ d¿n đến lặp vô h¿n và sinh lỗi khi thi hành
• Phần đá quy: Phân tích và xây dāng tr°áng hợp chung cÿa bài toán (có nghĩa
là đ°a bài toán về bài toán cùng lo¿i nh°ng vßi dÿ liáu nhỏ h¡n)
Xây dÿng giải thuật đệ quy
Khi cài đặt thuÁt toán đá quy ta tiến hành nhÿng b°ßc sau:
• B°ßc 1: Xác đßnh mục đích, đầu vào và đầu ra để từ đó xác đßnh tên tiêu đề hàm (tên hàm và tham số hình thāc cÿa nó)
• B°ßc 2: Xác đßnh tr°áng hợp suy biến (neo)
Trang 3• B°ßc 3: Phân tích và xây dāng tr°áng hợp chung cÿa bài toán (phần đá quy)
Có nghĩa là đ°a bài toán về bài toán cùng lo¿i nh°ng vßi dÿ liáu nhỏ h¡n
Từ 3 b°ßc trên, áp dụng nguyên tắc viết ngôn ngÿ ta xây dāng đ°ợc hàm đá qui (thông th°áng sử dụng toán tử điều kián (if&else) để viết hàm đá quy
Ví dụ 1: Tính x yvßi xyđ°ợc đßnh nghĩa nh° sau: 1 0
0
* 1
= þ
−
y khi x y
y
x
• B°ßc 1: Xác đßnh tham số đầu vào là x và y, tham số đầu ra là Ta luôn nhÁn xy
đ°ợc giá trß xy duy nhất, do đó ta sử dụng hàm có kiểu trả về
• B°ßc 2: Phần neo: y=0 thì tổng x0 = 1
• B°ßc 3: Phần đá quy: là tr°áng hợp thāc hián l¿i bài toán vßi giá trß nhỏ h¡n y =
y - 1 Tāc là āng vßi tr°áng hợp thāc hián l¿i lái gái cũng đều có chung tham số đầu vào là y nh°ng vßi giá trß nhỏ h¡n y = y – 1 và đều có khuynh h°ßng đến tr°áng hợp suy biến y = 0
Trang 4Nguyễn Thị Anh Đào Trang 3
int dem(long n)
{
if(n==0) return 0;
else return (1+ dem(n/10));
Ví dụ Xuất đảo ng°ợc một số nguyên d°¡ng ra màn hình3:
Trang 5− Hiáu cÿa 2 tÁp hợp: hiáu cÿa 2 tÁp hợp A B là một tÁp hợp chāa các phần \
tử thuộc A mà không thuộc B
Trang 6Nguyễn Thị Anh Đào Trang 5
− Hợp cÿa hai tÁp hợp: hợp cÿa 2 tÁp A B là một tÁp hợp chāa các phần tử ø hoặc thuộc A hoặc thuộc B
− Giao cÿa hai tÁp hợp: giao cÿa 2 tÁp A ÷ B là một tÁp hợp chāa các phần
tử vừa thuộc A vừa thuộc B
− Tích Đề các cÿa hai tÁp A, B là tÁp A - B = {(a,b) a A & b þ þ B}
Biểu diễn tập hợp trên máy tính: dùng mảng
Trang 72) Viết ch°¡ng trình kiểm tra 2 tÁp A, B có bằng nhau không
Gợi ý: Sử dụng mảng, sắp xếp tr°ßc khi tính
3) Viết ch°¡ng trình tính hợp, giao, hiáu và tích Descartes cÿa 2 tÁp A, B
Gợi ý: Sử dụng mảng, sắp xếp tr°ßc khi tính
4) Giải quyết bài 4 vßi cấu trúc danh sách liên kết (đ¡n, đôi)
5) Viết ch°¡ng trình tính hợp, giao, hiáu và tích Descartes cÿa 3 tÁp A, B, C.Gợi ý: Sử dụng nguyên lý bù trừ
6) Viết ch°¡ng trình kiểm tra 1 phần tử x có trong tÁp hợp A không?
7) Viết ch°¡ng trình thêm phần tử x vào tÁp hợp A
8) Tìm phần tử bé nhất, lßn nhất trong tÁp hợp
III Hệ thức truy hồi
A Lý thuyết
Định nghĩa hệ thức truy hồi: Há thāc truy hồi đối vßi dãy số {a } là công thāc n
biểu dißn a qua một hay nhiều số h¿ng đi tr°ßc cÿa dãy, cụ thể là an 1, a2, &, an-1
vßi mái n n0nguyên d°¡ng Dãy số đ°ợc gái là lái giải hay nghiám cÿa há thāc truy hồi nếu các số h¿ng cÿa nó thỏa mãn há thāc truy hồi
Giải hệ thức truy hồi:
− Bằng ph°¡ng pháp lặp
− Bằng ph°¡ng trình đặc tr°ng
Giải hệ thức truy hồi trên máy tính: dùng giải thuÁt đá quy
Ví dụ 1: Viết ch°¡ng trình cài đặt bài toán lãi kép
Trang 8Nguyễn Thị Anh Đào Trang 7
Trang 92) Cho các dãy số thỏa mãn há thāc truy hồi sau đây, hãy viết ch°¡ng trình A(n) để tính giá trß cÿa há thāc (n nhÁp từ bàn phím):
a LÁp há thāc truy hồi cho dân số thế gißi n năm sau năm 2004
b Giải há thāc truy hồi cho dân số thế gißi n năm sau năm 2004
c Dân số thế gißi năm 2020 là bao nhiêu ?
d Viết hàm A(n) để tính kết quả
4) Cho dãy số {an} thoả mãn há thāc truy hồi: an= 5a - 6an-1 n-2; a =0 và a =1 0 1
a Giải há thāc truy hồi trên
b Viết hàm A(n) để tính an
5) Cho dãy số {an} thoả mãn há thāc truy hồi: an= 6a - 9an-1 n-2; a =1 và a =3 0 1
a Giải há thāc truy hồi trên
b Viết hàm A(n) để tính an
6) Xây dāng há thāc truy hồi và cài đặt thuÁt tóan đá quy cho các yêu cầu sau:
Trang 10Nguyễn Thị Anh Đào Trang 9
a Tìm số xâu nhß phân độ dài bằng 3 không có ba số 1 liền nhau
b Giả sử số vi trùng trong một quần thể sẽ tăng gấp 3 lần sau mỗi giá LÁp há thāc truy hồi tính số vi trùng sau n giá
c Giả sử rằng mỗi cặp thỏ trên đảo khi đ°ợc 1 tháng tuổi đẻ đ°ợc 2 cặp thỏ con
và từ 2 tháng tuổi mỗi tháng đẻ đ°ợc 6 cặp thỏ con Giả sử rằng trong thái gian thí nghiám không có con nào bß chết hoặc rái khỏi đảo.Tìm há thāc truy hồi cho số cặp thỏ trên đảo sau n tháng kể từ khi thả 1 cặp thỏ mßi sinh lên đảo
d Có bao nhiêu xâu nhß phân có độ dài n và không chāa 2 bít 0 liên tiếp
IV Bài toán liệt kê
A Lý thuyết
Phương pháp sinh
Ph°¡ng pháp sinh có thể áp dụng để giải bài toán liát kê tổ hợp đặt ra nếu nh° 2 điều kián sau đ°ợc thāc hián:
− Có thể xác đßnh đ°ợc một thā tā trên tÁp các cấu hình tổ hợp cần liát kê Từ
đó có thể xác đßnh đ°ợc cấu hình đầu tiên và cấu hình cuối cùng trong thā tā
đã xác đßnh
− Xây dāng đ°ợc thuÁt toán từ cấu hình ch°a phải là cuối cùng đang có, đ°a ra cấu hình kế tiếp nó
Ta sẽ gái thuÁt toán nói trong điều kián thā 2 là thuÁt toán sinh kế tiếp Rõ ràng
là thā tā trong điều kián thā 1 cần đ°ợc lāa chán sao cho có thể xây dāng đ°ợc thuÁt toán sinh kế tiếp Giả thiết rằng 2 điều kián nêu ra đã đ°ợc thāc hián, khi đó, thuÁt toán sinh để giải bài toán liát kê đ°ợc mô tả nh° sau:
Trang 11Có nhiều thuÁt toán đã đ°ợc nghiên cāu để có thể t¿o đ°ợc các cấu hình tổ hợp liền
kề ngay sau một cấu hình đã có Một trong nhÿng thā tā hay đ°ợc dùng đó là thā
tā từ điển, trong bài hác này chúng ta sẽ tìm hiểu về ph°¡ng pháp sinh cấu hình tổ hợp theo thā tā này
Cho = s1 s2 sp và ñ ò = t1 t2 tq là các dãy số hoặc ký tā Ta nói rằng ñ nhỏ h¡n ò (theo kiểu từ điển) , ký hiáu ñ < ò, nếu hoặc
(i) p < q và si = ti vßi mái i = 1, 2, , p
Giả sử dãy b1b2&bnlà dãy đang có, nhÁn xét rằng nếu dãy này toàn số 1 thì chính
là dãy cuối cùng cần tìm, quá trình liát kê kết thúc, còn nếu ch°a phải thì sẽ cộng thêm 1 (theo modun 2 có nhß) vào dãy đang có để nhÁn đ°ợc dãy kế tiếp Từ đó ta
có qui tắc nh° sau:
o Tìm i đầu tiên (theo thā tā i = n, n – 1, &,1) mà bi = 0
o Gán l¿i bi = 1 và b j= 0 vßi tất cả j > i Dãy mßi thu đ°ợc sẽ là dãy cần tìm
o ThuÁt toán:
o Đầu vào: n
o Đầu ra: Danh sách tất cả dãy nhß phân độ dài n theo thā tā từ điển tăng dần
o Các b°ßc:
1) Khởi t¿o dãy xuất phát: Gán b = 0 vßi mái i = 1, 2, , ni
2) Đ°a ra cấu hình đang có
Trang 12Nguyễn Thị Anh Đào Trang 11
5) Quay l¿i b°ßc 2
Thuật toán quay lui
Ý t°ởng chính cÿa thuÁt toán này là xây dāng dần các thành phần cÿa cấu hình bằng cách thử tất cả các khả năng Giả thiết cấu hình cần đ°ợc mô tả bằng một bộ gồm n thành phần x1, x2, , xn Giả sử đã xác đßnh đ°ợc i 1 thành phần x1, x2, − , xi-1 Ta xác đßnh thành phần thā i bằng cách duyát tất cả khả năng có thể đề cử cho nó (đánh số các khả năng từ 1 đến ni) Vßi mỗi khả năng j, kiểm tra xem khả năng j có chấp nhÁn đ°ợc không Có thể xảy ra 2 tr°áng hợp:
− Nếu ch p nhấ Án j thì xác đßnh xi theo j, sau đó nếu i = n, thì ta đ°ợc mộ ất c u hình, còn trái l i ta ti¿ ến hành xác đßnh xi+1
− Nếu th tất cả khả năng mà không khả năng nào đ°ợử c ch p nh n thì quay l i ấ Á ¿b°ßc tr°ßc để xác đßnh l¿i xi 1 −
Điều quan tráng cÿa thuÁt toán là phải ghi nhß, t¿i mỗi b°ßc đã đi qua, nhÿng khả năng đã thử để tránh trùng lặp Rõ ràng nhÿng thông tin này cần đ°ợc l°u trÿ theo c¡ cấu ngăn xếp (stack vào sau ra tr°ßc) Vì thế thÿ tục đá qui rất phù hợp vßi - thuÁt toán này B°ßc xác đßnh xi có thể dißn tả qua thÿ tục
<xác định xi theo j> và trả l¿i tr¿ng thái cũ sau lái gái Try(i+1) Các tr¿ng thái này đ°ợc ghi nhÁn nhá một số biến toàn cục (global), gái là biến tr¿ng thái
Trang 13Sau khi xây dāng thÿ tục đá qui Try , ch°¡ng trình chính giải bài toán liát kê có d¿ng :
Ví dụ: Liệt kê các dãy nhị phân có đß dài n
Ta biểu dißn dãy nhß phân d°ßi d¿ng x1, x2, xn, trong đó xi {0,1} Thÿ tục þTry(i) xác đßnh xi {0,1} Các giá trß này đ°ợc mặc nhiên chấp nhÁn mà không cần þphải thoả mãn điều kián gì (vì thế bài toán không cần biến tr¿ng thái)
//Ham liet ke cac day nhi phan do dai n
void Nhiphan( int i)
3 Cho số nguyên d°¡ng n, liát kê tất cả các hoán vß cÿa n số tā nhiên đầu tiên
4 Cho dãy a , a1 2,&,an các phần tử trong dãy khác nhau từng đôi một Liát kê tất các các hoán vß cÿa các giá trß trong dãy
Trang 14Nguyễn Thị Anh Đào Trang 13
5 *Cho ph°¡ng trình x1 + x2 +&+xn= C vßi C là hằng nguyên không âm Hãy liát
kê tất các các bộ nghiám (x1, x2,&,xn) vßi xi nguyên không âm
6 Cho n là số quân hÁu trên 1 bàn cá vua kích th°ßc n x n Hãy viết ch°¡ng trình liát kê tất các cách xếp các quân hÁu trên bàn cá sao cho chúng không ăn đ°ợc l¿n nhau
7 Bài toán quân Mã: cho bàn cá vua kích th°ßc n x n Hãy chỉ ra hành trình cÿa một quân Mã xuất phát từ ô đang đāng, đi qua tất cả các ô còn l¿i trên bàn cá, mỗi ô đúng 1 lần
o Ma trÁn liền kề là ma trÁn đối xāng đối vßi đồ thß vô h°ßng
o Đối vßi đồ thß vô h°ßng tổng hàng i = tổng cột i = deg(i)
o Đối vßi đồ thß có h°ßng
▪ Tổng hàng i = deg (i) = số cung xuất phát từ đỉnh i+
▪ Tổng cột i = deg (i) = số cung vào đỉnh i
-Trong nhiều āng dụng cÿa lý thuyết đồ thß thì mỗi c¿nh e = (u, v) đ°ợc gán vßi một con số c(e) hay c(u, v) gái là trọng số cÿa c¿nh e Đồ thß trong tr°áng hợp này gái
Trang 15Ví dụ:
Duyệt đồ thị: 2 phương pháp
Duyệt theo chiều sâu
Ý t°ởng cÿa thu t toán có th trìÁ ể nh bày nh° sau Ta sẽ ắt đầ b u tìm ki m t m t ế ừ ộ
đỉnh v0 nào đó cÿa đồ ß Sau đó chán u là đỉ th nh tùy ý kề vßi v và l0 ặp l¿i quá trình
đối vßi u Tổng quát hóa, giả s ta đang xét đỉử nh v Nếu nh° trong số các đỉnh kề vßi v tìm đ°ợc đỉnh w là ch°a đ°ợc xét thì ta sẽ xét đỉnh này (nó trở thành đã xét)
và bắt đầ ừu t nó ta s ti p t c quá trình tìm ki m Còn nẽ ế ụ ế ếu nh° không còn đỉnh nào
kề vßi v là ch°a xét thì ta sẽ nói rằng đỉnh này đã duyát xong, và quay trở l¿i tiếp tục tìm ki m tế ừ đỉnh mà tr°ßc đó ta đến đ°ợc đỉnh v (n u v = v thì k t thúc tìm ế 0 ếkiếm) Độ phāc t¿p cÿa thuÁt toán là O(n+m)
Thủ tục đệ qui mô t thu t toán DFSả ậ :
Trang 16Nguyễn Thị Anh Đào Trang 15
Ví dụ: Xét đồ ß cho trong hình sau Các đỉ th nh cÿa nó đ°ợc đánh số ¿ l i theo th ā
tā chúng đ°ợc thăm theo thÿ tục tìm kiếm theo chiều sâu mô tả ở trên Gi thi t ả ếrằng các đỉnh trong danh sách kề cÿa đỉnh v (Ke(v)) đ°ợc sắp xếp theo th tā ā tăng dần cÿa chỉ số
Hình minh háa: Chỉ số mßi (trong ngoặc) cÿa các đỉnh đ°ợc đánh l¿i theo thā tā chúng đ°ợc thăm trong thuÁt toán tìm kiếm theo chiều sâu
Duyệt theo chiều rßng
Trong thu t toán tìm ki m theo chiÁ ế ều sâu, đỉnh đ°ợc thăm càng muộn s càng ẽsßm trở thành đỉnh đã duyát xong Bởi vì các đỉnh đ°ợc thăm sẽ ần l°ợt đ°a vào lngăn xếp (Stack), nên đỉnh đ°ợc thăm sau cùng sẽ đ°ợc hoàn thành tr°ßc tiên Tìm kiếm theo chiều rộng trên đồ th , nß ếu nói m t cách ngộ ắn gán, đ°ợc xây dāng dāa trên c¡ sở thay thế ngăn xếp (Stack) bởi hàng đợi (Queue) V i s c i biß ā ả ến nh° vÁy, đỉnh đ°ợc thăm càng sßm sẽ sßm trở thành đỉnh duyát xong (tāc là sßm rái khỏi hàng đợi) Một đỉnh sẽ trở thành đã duyát xong ngay sau khi ta xét xong t t c các ấ ảđỉnh kề (ch°a đ°ợc thăm) vßi nó Thÿ t c có th mô t ụ ể ả nh° sau:
4(3)
7(8) 6(4)
5(5)
8(6)
9(7)
Trang 17// kh i t o các giá tr cở ạ ị ủa các bi n toàn c c ế ụ
For v V Chuaxet[v]= false; þ
Hình minh h a: Ch s m i (trong ngo c) cá ỉ ố ß ặ ÿa các đỉnh đ°ợc đánh l¿i theo th t ā āchúng đ°ợc thăm trong thuÁt toán tìm ki m theo chi u r ng ế ề ộ
Āng dụng cÿa 2 thu t toán tìm kiÁ ếm trên đồ ß th :
• Tìm đ°áng đi (chu trình) trên đồ thß
• Liát kê tất c ả các đ°áng đi có trong đồ thß
• Kiểm tra tính liên thông
5(6)
8(8)
9(9)
Trang 18Nguyễn Thị Anh Đào Trang 17
Tìm đưßng đi ngắn nhất trên đồ thị
Bài toán
Cho đồ thß G = (V, E) là đồ thß đ¡n liên thông có tráng số không âm, tìm đ°áng đi có tổng tráng số nhỏ nhất từ đỉnh s đến f þ V
Thuật toán Dijkstra
Đầu vào: Đồ thß vô h°ßng G = (V, E) vßi n đỉnh, s V là đỉnh khởi đầu, þ
a[u,v] là tráng số cÿa c¿nh e(u, v), u, v þ V
Giả thiết: a[u, v] 0 , u, v V þ
Đầu ra: Độ dài đ°áng đi từ s đến f Truoc[v], v V, ghi nhÁn đ°áng đþ i là các đỉnh tr°ßc v trong đ°áng đi ngắn nhất từ s đến f
B1: Gán nhãn L = , x V, Lx þ s = 0, T = V //T là tÁp các đỉnh ch°a duyát B2: Lặp khi nào T còn chāa đỉnh f
Tìm cây khung nhỏ nhất trên đồ thị
Thuật toán Prim
Đối vßi nhÿng đồ thß dày (số c¿nh m n(n − 1)/2) thuÁt toán Kruskal làm viác kém hiáu quả Trong tr°áng hợp đó, thuÁt toán Prim đ°ợc trình bày sau đây tỏ ra hiáu quả h¡n ThuÁt toán Prim còn đ°ợc gái là ph°¡ng pháp lân cÁn gần nhất Đầu vào: Đồ thß G = (V, E) đ¡n, liên thông, có tráng số a(u, v), u, v V, vþ *là đỉnh khởi đầu
Đầu ra: Cây khung T = (V , ET T) là cây khung nhỏ nhất trong đồ thß
Trang 19B1: V = {vT *}, trong đó v là đỉnh tuỳ ý cÿa đồ thß G.*
E = T ö
B2: Vßi mỗi đỉnh vj ÿ VT, tìm đỉnh wj þ V sao cho a(w , v ) = min a(x , v ) = | T j j i j òj
xi þ V dùng T òj để ghi nhÁn độ dài cÿa c¿nh có độ dài ngắn nhất trong số các c¿nh nối đỉnh v vßi các đỉnh đang có cÿa cây khung Và gán cho đỉnh vj nhãn [w , ] j òj
(hiểu là đỉnh v kề vßi đỉnh w cÿa cây khung nhất và có độ dài là ) Nếu không j j òj
tìm đuợc wj nh° vÁy (tāc là khi v không kề vßi bất cā đỉnh nào trong Vj T) thì gán cho v nhãn [0, j ]
Nếu òj > a(v , vj* j) thì đặt òj = a(v , vj* j) và nhãn cÿa vj là [vj*, ] òj
Ng°ợc l¿i, ta giÿ nguyên nhãn cÿa vj
Thuật toán: Kruskal
Đầu vào: Đồ thß G=(V,E) đ¡n, liên thông, có tráng số
Đầu ra: Cây khung T=(V, E ) là cây khung nh nh t T ỏ ấ
Đồ th không liên thông ß
Ng°ợc l¿i: Thu đ°ợc cây khung nhỏ nhất T có tÁp c¿nh ET
Trang 20Nguyễn Thị Anh Đào Trang 19
Tìm chu trình Euler trên đồ thị
Thuật toán:
Đầu vào: Đồ thß G=(V,E) có chu trình Euler và đỉnh a V bất kỳþ
Đầu ra: Chu trình Euler bắt đầu bằng đỉnh a
1 Kiểm tra đồ thß vô h°ßng có liên thông không?
2 Hãy tìm số thành phần liên thông trong một đồ thß
3 Hãy liát kê tất cả đ°áng đi giÿa 2 đỉnh cÿa một đồ thß (có h°ßng và vô h°ßng)
4 Tìm đ°áng đi trong mê cung kích th°ßc (nxm): quy °ßc: E là ô nhà thám hiểm đang đāng, O là an toàn, X là ô nguy hiểm Mỗi b°ßc đi thì nhà thám hiểm có thể đi đến ô an toàn liền kề
5 Kiểm tra xem đồ thß có chu trình Euler không? Nếu có hãy tìm chu trình đó
6 Kiểm tra xem đồ thß có đ°áng đi Euler không? Nếu có hãy tìm đ°áng đi đó
Trang 217 Cài đặt thuÁt toán Dijkstra để tìm đ°áng đi ngắn nhất trong đồ thß có tráng số d°¡ng
8 Cài đặt thuÁt toán Prim (Kruskal) tìm cây khung nhỏ nhất
Dÿ liáu các bài toán trên đ°ợc lấy từ bài tÁp toán rái r¿c trong tÁp bài giảng hoặc từ bài giảng ở lßp