BO GIAO DUC VA DAO TAO DAI HOC HUE
TRUONG DAI HOC KHOA HOC
TRA LE DONG HAI
UNG DUNG PHUONG PHAP DE QUY QUAY LUI TRONG BOI DUONG HOC SINH
GIOI TIN HOC TRUNG HOC PHO THONG
LUAN VAN THAC SI KHOA HOC
CONG NGHE THONG TIN
Thira Thién Hué, 2020
Trang 2
BO GIAO DUC VA DAO TAO ĐẠI HỌC HUE
TRƯỜNG ĐẠI HỌC KHOA HỌC
TRA LE DONG HAI
UNG DUNG PHUONG PHAP DE QUY QUAY LUI TRONG BOI DUONG HOC SINH
GIOI TIN HOC TRUNG HOC PHO THONG
CHUYEN NGANH: KHOA HOC MÁY TÍNH MA SO: 8480101
LUAN VAN THAC Si KHOA HOC DINH HUONG UNG DUNG
NGƯỜI HƯỚNG DẪN KHOA HỌC
PGS TS HOÀNG QUANG
Thừa Thiên Huế, 2020
Trang 3LOI CAM DOAN
Tôi xin cam đoan luận van này là công trình nghiên cứu của cá nhân tôi dưới
sự hướng dẫn khoa học của thầy PGS.TS Hoàng Quang, trường Đại học Khoa học —
Đại học Huế Tất cả các số liệu và kết quả nghiên cứu trong luận văn này là trung thực, chưa được công bố bất kỳ một công trình nghiên cứu nào khác
Mọi tài liệu trong luận văn được trích dẫn rõ ràng và trung thực tên tác giả, tên
công trình, thời gian và địa điểm công bố
Trang 4LOI CAM ON
Lời đầu tiên, tôi xin gởi lời cảm ơn chân thành sâu sắc đến Quý thầy cô giáo
Khoa Công nghệ thông tin - Trường Đại học Khoa học Huế đã tận tình hướng dẫn, truyền đạt kiến thức, tạo điều kiện thuận lợi trong quá trình học tập và thực hiện
luận văn tốt nghiệp
Tôi xin chân thành gửi lời biết ơn đến PGS.TS Hoàng Quang, người thầy đã hướng dẫn tận tình và có những góp ý sâu sắc, hướng dẫn rất quý báu cho tôi trong suốt quá trình nghiên cứu, kịp thời cho tôi nhiều lời động viên cũng như những nhận xét đúng đắn để tôi có thê hoàn thành tốt được đề tài này
Trong quá trình thực hiện để tài, xin chân thành gửi lời cảm ơn đến sự giúp đỡ, những lời động viên từ phía gia đình, đồng nghiệp, bạn bè là động lực to lớn giúp tơi hồn thành tốt dé tài nghiên cứu của mình Tôi cũng gửi lời cảm ơn đến
trường PTDTNT tỉnh Gia Lai, nơi tôi đang công tác đã tạo điều kiện cho tôi đi học
và thực hiện đề tài nghiên cứu này
Bản thân tôi đã cố gắng hết sức trong quá trình thực hiện để tài này nhưng chắc chắn sẽ không tránh khỏi những thiếu sót Kính mong quý thầy cô và các bạn tận tình góp ý, chỉ bảo
Xin chan thanh cam on!
Thừa Thiên Huế, tháng 3 năm 2020
Tác giả
Trang 5MUC LUC
Trang LOT GAM DOAN ossssessssssssovcasansovsacasscnnsessstunsissarnevaasanvenansoreosasoreonaaseansnasenanrianannevienss i
LOT CAM ON oscssssessssssssssseesscssssssssseeecsssssssssesssssssssssseessssssssssseesessssssssessssssssneessses ii
„10/9005 0 iii
DANH MUC CAC HINH VE cessessessssssessscsssssscsscsssssscsucssscsscssssssssucessssssssccassssesseenss v
MO DAU wiseescsssssssessscsssssssseesssssssssseeeesssssssssseesssssssuseesssssssssnssesessssssneseeesssssssnsneessesssy 1
Chương 1 GIỚI THIỆU PHƯƠNG PHÁP LẬP TRÌNH ĐỆ QUY 5 1.1 Khái niệm về đệ quy 2- 22 2222211221122112211211121112112122212 xe 5 1.1.1 Khái niệm về hình thức đệ quy -©2222222222221222122212212222 e6 5
1.1.2 (Dinhenghia: dE Quy: encesrecnersesernneseree mercer meem cesnremente semen 5 6
1.1.3 Các bước để giải một bài toán đệ quy -5222222 2222221221222 xee 7
172; Giải Thu đẾ QUW sassszssisnristiiteisBsiEBBIBBIEIIGGAISENGDNNGEEISORENEERGHIESERGĐISSENBAĐSEtagni 8 1.21, Khai niémeiai thuatd€ Quy: scence neue nnn enensmnencemm cements! 8
1.2.2 Ví dụ v quy . -â2-2222221221112111211121112112112112212212ee Đ
13, Chong trinh con Ể'QUY seeszzrsetstrendssirteointytURODJGHORAGISRORSHGEORNHtRGNSiiiĐGg 12 1.3.1 Khái niém chuong trinh con d€ qUy ccc cececeeeceeeeeeceeettetteteneenees 12 1.3.2 Cầu trúc chính của chương trình con đệ quy 22s¿22z2zzsze2 12 1.4 Nguyên tắc hoạt động của giải thuật đệ quy -22 2222221222122 cee 13
1.4.1 Khái niệm StacK - Q10 222111112111 1211 11111 1111101119111 kg ke 13
1.4.2 Nguyên tắc hoạt động của giải thuật đệ quy . 52-+zzsze¿ 13 1.5 Ưu điểm và hạn chế của giải thuật đệ quy 222222 22212221221222 xe 14
bào 14 1.5.2 Ham nh ố 15
1.6 Một số bài toán giải bằng phương pháp đệ quy -.- 2222222222222 15 1.6.1 Tính giai thừa của một số nguyên dương n 2-©2222z222Ec22xSze2 15
1.6.2 Tinh tổng S(n) = 1! +2! + 3! + +n! (n là số nguyên đương) 17
1.6.3 Tính lãy thừa: a" với n là một số nguyên dương . -:-s¿ 18
Trang 61.6.5 Bài toán tháp Hà NỘI - S2 HH HH He 22 1.7 Tiểu kết chương Ì 22 222222222121122212221221121.21221 2 te
Chương 2 GIỚI THIỆU VẺ PHƯƠNG PHÁP ĐẸ QUY QUAY LU
2.1 Giải bài toán bằng phương pháp đệ quy quay lui 52s22z+2zzcsze2 26 2.1.1 Khái niệm St SH HH Hà HH HH Hy 26
2.1.2 Ý tưởng 2.222 222222122112211211122112112111211221212222122221222 re 27
2.2 Phương pháp giải bài toán bằng phương pháp quay lui -2¿ 30 22+]; JhươngPHD site n6i62lEEIGDIEEIGDNIIEEEDHIESEEGĐISSIRDMIEEIENNHEIVHSIRENSSSSANgE 30
2.2.2 Giải thuật tổng quát . - 22 2222212211211121112211211121112212212222 xe 31
2.3 Một số bài toán quen thuộc giải bằng phương pháp đệ quy quay lui 32
2.3.1 Bài toán liệt kê dãy nhị phân độ dài n - 5 ScScscccsrrrrerreee 32
2.3.2 Bài toán liệt kê tất cả các hoán vị của tập số {1, 2, 3 ,N} 36 2.3.3 Bài toán liệt kê tất cả các tô hợp chập k của tập {1, 2, 3 , N} 40 2.4 Tiểu kết chương 2 - 22-221 221122112112111211211211211211222222 re 44 Chương 3 ÁP DỤNG PHƯƠNG PHÁP ĐẸ QUY QUAY LUI ĐỂ GIẢI CÁC :7.900197.0.N:/9:.68.)10)709)/0)277 7ô ốc 45
3.1 Nhận đạng bài toán giải bằng phương pháp đệ quy quay lui 45 3.2 Giải một số bài toán bằng phương pháp đệ quy quay lui - 46 3.2.1 Bài toán liệt kê các chỉnh hợp không lặp .-.- ¿5c cccssss: 46
3.2.2 Liệt kê hoán vị xâu có độ đài n 2221122221122 esrsxg 49 3.2.3 Liệt kê các cách đặt kí tự trên hình vuông 4x4 53
3.2.4 Bài toán xếp n quân hậu trên bàn cờ nX -2-2222222222222 2e 57 3.2.5 Vòng tròn nguyên tỐ - 2: ©22222122112112112211211211221222222 re 63
3.3 Tiểu kết chương 3 22222 2212221221122112211222222222222222 are 68 KET LUAN VA HƯỚNG PHÁT TRIÊN CỦA ĐÈ TÀI -. 69
'TẢTILIÊU THAM KHẢ ¿zzxzzzzeyzzs:gsnx0st0naig18id03100H1158T1SDSR0P-SREHĐSH00008808 70 PHỤ LỤC
Trang 7Hinh 1.1 Hinh 1.2 Hinh 1.3 Hinh 2.1 Hinh 2.2 Hinh 2.3 Hinh 2.4 Hinh 2.5 DANH MỤC CÁC HiNH VE Trang Ứng dụng của đệ quy trong tao hình - 2s 2222222221221312111211.2112E xe 6
Sơ đồ thể hiện chiến thuật tìm kiếm từ điền 9
Stack thể hiện cách lưu trữ của giải thuật đệ quy . -5ss¿ 13 Thuật toán quay lui thể hiện theo sơ đồ cây tìm kiếm theo chiều sâu .26 Cây tìm kiếm theo chiều sâu thể hiện phương pháp quay lui 29 Cây mô tả dãy nhị phân với N3 .- n St snnhhrererreere 35 Cây mơ tả hốn Vi VỚI ñ it SH nhà Ha tre 38
Trang 8MO DAU > Ly do chon dé tai
Trong thời đại ngày nay, thế giới đang điễn ra quá trình tin học hóa trong
nhiều lĩnh vực hoạt động của xã hội Tin học phát triển nhanh như vũ bão và đã trở
thành một ngành khoa học đóng vai trò quan trọng không thê thiếu đối với sự phát
triển của xã hội Xã hội hiện tại đang chứng kiến một cuộc cách mạng to lớn trong
lĩnh vực công nghệ Những phát minh mới liên tục được cập nhật Thường thì nguồn gốc của những phát minh này là từ những chương trình gạo cội có khả năng chỉ phối và thao túng các xu hướng công nghệ đang diễn ra Trong số đó không thê không nói đến mã hóa và thuật toán, được sử dụng để phát triển các chương trình
cạnh tranh như vậy Vì thế, đối với một chương trình thành công và có tam ảnh hưởng, việc khai thác một thuật toán đúng và chính xác là điều tất yếu Ý thức được tầm quan trọng của tin học nên xã hội đã có những đầu tư lớn vào lĩnh vực này đặc biệt là lĩnh vực giáo dục nhằm đảo tạo một đội ngũ tri thức trẻ có nền tảng tin học
vững vàng nhằm đáp ứng nhu cầu ngày càng cao của xã hội
Đề đánh giá chất lượng đạy và học ở các trường phổ thông, một trong những
tiêu chí được ngành giáo dục đặc biệt coi trọng đó là số lượng và chất lượng học sinh giỏi đạt được hàng năm của trường Chính vì vậy, bên cạnh việc nâng cao chất
lượng đại trà thì việc phát hiện và bồi dưỡng học sinh giỏi đang là mối quan tâm hàng đầu của tất cả các trường phô thông Đối với bộ môn Tin học, bồi đưỡng được học sinh giỏi trung học phổ thông đòi hỏi giáo viên phải có khả năng biên soạn tài
liệu, chương trình, nội dung bồi dưỡng rõ ràng, cụ thé, chi tiết cho từng mảng kiến
thức, từng chuyên để Muốn làm được như vậy đòi hỏi giáo viên phải có chuyên môn vững vàng về lập trình, có phương pháp giảng dạy tốt về thuật toán Đối với học sinh muốn đạt được kết quả cao trong kỳ thi học sinh giỏi cấp tỉnh và cao hơn nữa thì các em phải có một lượng kiến thức sâu về thuật toán và lập trình Những
kiến thức này đối với chương trình phổ thông hiện hành thì không thể thực hiện
được Nhiệm vụ của giáo viên là dạy thêm cho các em kiến thức về thuật toán và
Trang 9Các bài toán trong bồi dưỡng học sinh giỏi tin học thường rất đa dạng và phức tạp, mỗi bài toán có thể có nhiều phương pháp giải khác nhau Đề có thể lựa chọn phương pháp thích hợp cho bài toán, chúng ta có thể phân chia các bài toán thành các dạng bài toán tổng quát và chỉ ra phương pháp giải cho các đạng bài toán đó Dạng bài toán tìm nghiệm tối ưu hay bài toán liệt kê là một trong những lớp bài toán khó, thường xuất hiện trong các đề thi học sinh giỏi cấp thành phố, cấp tỉnh hay cấp quốc gia Có nhiều phương pháp giải lớp bài toán này nhưng phương pháp đệ quy quay lui là phù hợp nhất Tuy nhiên việc dạy cho học sinh có thể sử dụng tốt phương pháp này để giải quyết các bài tốn khơng phải là vấn để dễ đàng Phương pháp quay lui là một kĩ thuật thiết kế giải thuật đựa trên đệ quy Ÿ tưởng của quay
lui là tìm lời giải từng bước, mỗi bước chọn một trong số các lựa chọn khả dĩ và đệ
quy Người đầu tiên đề ra thuật ngữ này (backtrack) là nhà toán học người Mỹ D H Lehmer vào những năm 1950
La một giáo viên giảng đạy bộ môn Tin học ở trường trung học phổ thông,
việc bồi dưỡng học sinh giỏi là nhiệm vụ vô cùng quan trọng, tôi nhận thấy việc ứng
dụng phương pháp đệ quy quay lui trong thiết kế thuật toán là một mảng kiến thức
thực sự cần thiết đối với học sinh tham gia bồi dưỡng học sinh giỏi
Vì vậy, tôi chon dé tài “Ứng dụng phương pháp đệ quy quay lui trong bôi dưỡng học sinh giỏi Tìn học Trung học phổ thông” để làm đề tài nghiên cứu nhằm nâng cao chất lượng và hiệu quả trong bồi dưỡng học sinh giỏi, góp phần nâng cao tỷ lệ giải trong các kỳ thi học sinh giỏi môn tin học cấp tỉnh, cấp quốc gia
Mặc đù bản thân tôi luôn cố gắng hết sức trong quá trình thực hiện để tài này nhưng chắc chắn sẽ không tránh khỏi những thiếu sót, kính mong quý thầy cô và các bạn tận tình góp ý, chỉ bảo
> Tổng quan tài liệu
Hiện nay có rất nhiều tài liệu về phương pháp đệ quy quay lui và nhiễu bài toán về đệ quy quay lui đã được phân tích và cài đặt theo nhiều cách khác nhau
Trang 10thống Việc hệ thống và nhận dạng các bài toán có thể giải bằng phương pháp đệ quy quay lui sẽ giúp các em học sinh dễ tiếp thu phương pháp và giáo viên có thêm tài liệu tham khảo trong giảng dạy và nghiên cứu
> Mục tiêu nghiên cứu
Mục tiêu chính của để tài là nghiên cứu về ứng dụng phương pháp đệ quy quay lui trong bồi đưỡng học sinh giỏi Tin học khối trung học phổ thông Đề tài "Ứng dụng phương pháp đệ quy quay lui trong bồi đưỡng học sinh giỏi Tin học trung học phô thông" được thực hiện nhằm nâng cao chất lượng và hiệu quả trong công tác bồi đưỡng học sinh giỏi ở trường trung học phổ thông
Đề tài cũng giúp cho học sinh hiểu rõ hơn về kỹ thuật đệ quy, kỹ thuật đệ quy quay lui, ứng dụng phương pháp đệ quy quay lui để nhận dạng và giải một số bài toán trong Tin học Từ đó góp phần nâng cao khả năng tự học, tự lập trình của bản thân và giúp cho các em tham gia kỳ thi học sinh giỏi Tin học khối trung học phô thông đạt kết quả ngày càng cao
Tạo ra nguồn tài liệu tham khảo về thuật toán cho học sinh và giáo viên trong
việc dạy bồi dưỡng học sinh giỏi Tin hoc trong trường trung học phô thông >_ Đối tượng và phạm vi nghiên cứu
Đề tài "Ứng dụng phương pháp đệ quy quay lui trong bồi đưỡng học sinh giỏi Tin học trung học phổ thông" có đối tượng và phạm vi nghiên cứu là lý thuyết về đệ quy, phương pháp đệ quy quay lui và ứng dụng phương pháp đệ quy quay lui
để giải một số bài toán liệt kê trong Tin học
> Phương pháp nghiên cứu
Thu thập, phân tích các tài liệu và thông tin liên quan đến lý thuyết đệ quy, phương pháp đệ quy quay lui
Trang 11Thiết kế thuật toán giải các bài toán đã được lựa chọn trong chương trình
bồi dưỡng học sinh giỏi Tin học trung học phổ thông bằng phương pháp đệ quy quay lui
Dùng ngôn ngữ lập trình Pascal cài đặt bài toán, chạy thử nghiệm trên một số
bộ đữ liệu để đánh giá kết quả
> Bố cục của luận văn
Luận văn gồm phần mở đầu, ba chương nội dung, kết luận và tài liệu
tham khảo
Chương I: Giới thiệu phương pháp lập trình đệ quy
Nội đung trình bày tập trung về khái niệm đệ quy, giải thuật đệ quy, nguyên
tắc hoạt động của giải thuật đệ quy, ưu điểm và hạn chế của giải thuật đệ quy và
giải một số bài toán cơ bản bằng giải thuật đệ quy
Chương 2: Giới thiệu về phương pháp đệ quy quay lui
Nội dung chương chủ yếu tập trung về phương pháp giải bài toán bằng đệ quy quay lui và giải một số bài toán cơ bản bằng phương pháp đệ quy quay lui
Chương 3: Áp đụng phương pháp đệ quy quay lui để giải các bài toán học sinh giỏi
Trang 12Chương 1 GIỚI THIỆU PHƯƠNG PHÁP LAP TRINH DE QUY
Đệ quy mặc dù không nằm trong nội dung chương trình Tin học phổ thông nhưng là một trong những kỹ thuật lập trình thường được sử dụng trong các ky thi
hoc sinh gidi, Olympic, Tin hoc tré
Chương này sẽ giới thiệu về phương pháp đệ quy, bao gồm các phần: những khái niệm cơ bản về đệ quy, các bước để giải bài toán bằng đệ quy và một số ví dụ
minh hoa
1.1 KHAI NIEM VE DE QUY
1.1.1 Khái niệm về hình thức đệ quy
Trong toán học và khoa học máy tính, các tính chất (hoặc cầu trúc) được gọi
là đệ quy nếu trong đó một lớp các đối tượng hoặc phương pháp được xác định bằng việc xác định một số rất ít các trường hợp hoặc phương pháp đơn giản (thông thường chỉ một) và sau đó xác định quy tắc đưa các trường hợp phức tạp về các trường hợp đơn giản
s* Chẳng hạn, định nghĩa sau là định nghĩa đệ quy của tổ tiên:
- Bố mẹ của một người là tổ tiên của người ấy (trường hợp cơ bản); - Bố mẹ của tổ tiên một người bất kỳ là tổ tiên của người ấy (bước
đệ quy)
s* Hay ta nói một đối tượng là đệ quy nếu nó được định nghĩa qua chính nó hoặc một đối tượng khác cùng dạng với chính nó bằng quy nạp [2]
- Ví dụ: Đặt hai chiếc gương cầu đối diện nhau Trong chiếc gương
thứ nhất chứa hình chiếc gương thứ hai Chiếc gương thứ hai lại chứa hình chiếc
Trang 13- Một ví dụ khác là nếu người ta phát hình trực tiếp phát thanh viên ngôi bên máy vô tuyến truyền hình, trên màn hình của máy này lại có chính hình ảnh của phát thanh viên đó ngồi bên máy vô tuyến truyền hình và cứ như thế
Các định nghĩa kiêu như vậy cũng thường thấy trong toán học (chính là quy
nạp toán học)
s* Một số hình ảnh ứng đụng của đệ quy trong tạo hình
Tam giác sierpinski Kim tự tháp sierpinski Bong tuyết Koch
Hình 1.1 Ứng dụng của đệ quy trong tạo hình 1.1.2 Định nghĩa đệ quy
Từ các khái niệm và ví dụ trên, ta có thể định nghĩa đệ quy theo hai cách:
1 Đệ quy (trong tiếng Anh là reeursion) là phương pháp dùng trong các chương trình máy tính trong đó có một hàm tự gọi chính nó
2 Một khái niệm X được định nghĩa theo đệ quy nếu trong định nghĩa X có sử dụng chính khái niệm X
Ví dụ: Một số ví dụ kinh điển về đệ quy: 1 Định nghĩa số tự nhiên
- 0 là một số tự nhiên
- n là một số tự nhiên khi n-l là số tự nhiên
2 Định nghĩa về giai thừa nI -0!=1
Trang 143 Dinh nghia day s6 Fibonacci: Trong toan hoc, cac s6 Fibonacci la một
dãy số, kí hiệu F(n) (n là số nguyên không âm), được định nghĩa đệ quy theo cơng thức sau: Ũ, „=Đ #tÐ0 =1L, n=l P-h+h@- 2, nl Dãy bắt đầu từ hai số F(0)=0 và F(1)=1 Như vậy, các số đầu tiên của dãy Fibonacci la: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765
1.1.3 Các bước để giải một bài toán đệ quy
Một bài toán giải bằng phương pháp đệ quy, ta thực hiện theo 3 bước [4]: 1 Tham số hóa bài toán: Tổng quát hóa bài toán cụ thể cần giải thành bài tốn tơng quát (một họ các bài toán chứa bài toán cần giải), tìm ra các thông số cho bài toán tổng quát đặc biệt là nhóm các thông số biểu thị kích thước của bài toán - các thông số điều khiển (các thông số mà độ lớn của chúng đặc trưng cho độ phức tạp của bài toán, và giảm đi qua mỗi lần gọi đệ quy)
2 Phát hiện các trường hợp suy biến và tìm giải thuật cho các giải thuật này: Đây là các trường hợp suy biến của bài toán tổng quát, là các trường hợp tương ứng với các giá trị biên của các biến điều khiến (trường hợp kích thước bài toán nhỏ nhất), mà giải thuật giải không đệ qui (thường rất đơn giản)
3 Phân rã bài toán tổng quát theo phương thức đệ quy: Tìm phương án giải bài toán trong trường hợp tông quát bằng cách biểu dién bài toán đưới dang bai toán cùng loại mà hoặc có giải thuật không đệ quy hoặc là bài toán trên nhưng có kích thước nhỏ hơn
Ví dụ: Bài toán tính giai thừa của một số tự nhiên n e _ Tham số hóa bài toán: Cách tính giai thừa n
Trang 15Néu n> 0 thin! =n*(n-1)! e Phat hién trường hợp suy biến và tìm giải thuật cho tình huống này Nếu n = 0 thì gt := 1 e _ Phân rã bài toán tổng quát theo hướng đệ quy Nếu n > 0 thì gt :=n * gt (n-1)
1.2 GIẢI THUẬT ĐẸ QUY 1.2.1 Khái niệm giải thuật đệ quy
Nếu lời giải của một bài toán P được thực hiện bằng lời giải của bài toán P'
có dạng giống như P thì đó là một lời giải đệ quy Giải thuật tương ứng như vậy gọi là giải thuật đệ quy [2]
Thoạt nghe thì các bạn thấy có vẻ hơi lạ nhưng điểm mấu chốt cần lưu ý là: P' tuy có dạng giống như P, nhưng theo một nghĩa nào đó, nó phải "nhỏ" hon P, dé giải hơn P và việc giải nó không cần dùng đến P
Trong khoa học máy tính có một phương pháp chung để giải các bài toán trong Tin học là chia bài toán thành các bài toán con đơn giản hơn cùng loại Phương pháp này được gọi là kỹ thuật lập trình chia để trị Chính nó là chìa khóa đề thiết kế nhiều giải thuật quan trọng, là cơ sở của quy hoạch động
1.2.2 Ví dụ về đệ quy
- Ví dụ I: Tính giai thừa của một số tự nhiên n
Ifn = 0 then gt:= 1 Else gt:=n*gt(n-1)
Bai toán tính n! được chia nhỏ như sau:
Ta có thể thấy rằng, muốn tính n! thì ta phai tinh duoc (n-1)!, dé tinh duoc
(n-1)! Thi ta phai tinh duge (n-2)!, cir lam nhu vay cho dén khi ta sẽ lùi về tính
1!, ma 1! = 1 Vi vay cứ thực hiện tính ngược trở lên ta sẽ tính được n!
Trang 16if Tir dién là một trang then Tim ti trong trang này
else
begin
Mở từ điển vào trang giữa
Xác định xem nửa nào của từ điển chứa từ cần tìm
¡ƒ Từ đó nằm ở nửa trước của từ điển z#en Tìm từ đó trong nửa trước else Tim từ đó trong nửa sau end; Tắt nhiên giải thuật trên mới chỉ được nêu dưới dạng "thô" và còn nhiều chỗ chưa cụ thể, chẳng hạn:
- Tìm từ trong một trang thì làm thế nào - Thế nào là mở từ điển vào trang giữa
- Làm thế nào đề biết từ đó nằm ở nửa nào của từ điền
Có thể hình dung chiến thuật tìm kiếm này một cách khái quát như sau:
| Tìm tù rong tự điền
Tim từ ương tự đến Tìm từ mong tự điền |
nita trƯỚC ni sau
Hình 1.2 Sơ đồ thể hiện chiến thuật tìm kiếm từ điển Ta thấy có hai điểm chính cần lưu ý:
- Sau mỗi lần từ điển được tách đôi thì một nửa thích hợp sẽ lại được tìm
kiếm bằng một "chiến thuật” như đã dùng trước đó
- Có một trường hợp đặc biệt, khác với mọi trường hợp trước, sẽ đạt được
Trang 17bằng cách tìm từ mong muốn trên trang đó chẳng hạn, bằng cách tìm tuần tự Trường hợp đặc biệt này được gọi là trường hợp suy biến
- Có thê coi đây là một "chiến thuật " kiểu "chia để trị" Bài toán được tách thành bài toán nhỏ hơn và bài toán nhỏ hơn lại được giải quyết với thuật chia dé tri
như trước, cho tới khi xuất hiện trường hợp suy biến
Ta thể hiện giải thuật tìm kiếm này đưới dạng một thủ tục: Procedure TIMKIEM (TD,Tu)
Begin
if Tự điển chỉ còn là một trang then Tìm từ Tu trong trang này
else
begin
Mở tự điển vào trang giữa
Xác định xem nửa nào của tự điển chứa từ Tu
¡ƒ Tu nằm ở nửa trước của tự điển then TIMKIEM (TD 1,Tu)
else TIMKIEM (TD 2,Tu)
end;
{TD 1 va TD 2 là đầu mối dé truy nhập được vào nửa trước và nửa sau của
từ điển}
End;
- Ví dụ 3: Hãy xét bài ton day sé Fibonacci
Day s6 Fibonacci bắt nguôn từ bài tốn cơ về việc sinh sản của các cặp thỏ
Bài toán được đặt ra như sau:
1) Các con thỏ không bao giờ chết
Trang 183) Khi đã sinh con rồi thì cứ mỗi tháng tiếp theo chúng lại sinh được một cặp con mới
Giả sử bắt đầu từ một cặp mới ra đời thì đến tháng thứ n sẽ có bao nhiêu cặp?
Ví dụ: n=6, ta thấy:
Thang thir 1: 1 cặp (cặp ban đầu)
Tháng thứ 2: 1 cặp (cặp ban đầu vẫn chưa đẻ) Tháng thứ 3: 2 cặp (đã có thêm 1 cap con) Tháng thứ 4: 3 cặp (cặp đầu vẫn đẻ thêm) Tháng thứ 5: 5 cặp (cặp con bắt đầu đẻ) Thang thir 6: 8 cặp (cặp con vẫn đẻ tiếp)
Bây giờ ta xét tới việc tính số cặp thỏ ở tháng thứ n: F(n)
- Nếu mỗi cap tho 6 thang thir (n-1) đều sinh con thi F(n) = 2(n-1)
Nhưng không phải như vậy Trong các cặp tho ở tháng thứ (n-l) chỉ có những cặp đã có ở tháng thứ (n-2) mới sinh con ở tháng thứ n được thôi Do äó: F(n) = F(n-2) + F(n-l) Vì vậy có thể tính F(n) theo: 1 nếu n<=2 F(n) = F(n-2) +F(n-1) nếu n>2
Dãy số thể hiện F(n) ứng với các gia tri cua n= 1, 2, 3, có dạng:
112358 13 21 3455 doc goi la day sé Fibonacci Day sé Fibonacci
còn là mô hình của rất nhiều hiện tượng tự nhiên và cũng được sử dụng nhiều trong Tin học Sau đây là thủ tục đệ quy thể hiện giai thuat tinh F(n): Function F(n) 1 ifn
Trang 191.3 CHUONG TRINH CON DE QUY 1.3.1 Khai niém chuong trinh con dé quy
Là một chương trình con (ham, thủ tục) mà trong thân của nó có lời gọi đến
chính nó (hay còn gọi là lời gọi đệ quy) với kích thước nhỏ hơn của tham số [2]
Ví dụ 1: Hàm tính giai thừa của một số tự nhiên n
Function gt(n: Word): Longint; Begin
Ifn =0 then gt: =1
Else gt :-=n*gt(n - 1);
End;
Ví dụ 2: Hàm tính lũy thừa nguyên của một số thực x (tính x") Function LT(x: real, n: integer): real;
Begin
If n=0 then LT:=1 else LT:=LT(x,n-1)*x;
End;
1.3.2 Cấu trúc chính của chương trình con đệ quy
Một chương trình con đệ quy về căn bản gồm 2 phẩn[2]:
- Phần neo (phẩn suy biến, cơ sở): chứa các tác động của hàm hoặc thủ tục với một số giá trị cụ thê ban đầu của tham số để dừng đệ quy
Vi du: Ifn:=0 then GT:= 1;
- Phan dé quy (phan tong quát, hạ bậc) : định nghĩa tác động cần được thực hiện cho giá trị hiện thời của các tham số bằng các tác động đã được định nghĩa
Trang 20Vi du: GT:=n*GT (n-1); Cấu trúc hàm đệ quy:
Funntion tên hàm(tham số:kiểu đữ liệu):kiểu dữ liệu: Tf (suy biến) then
<giải quyết trường hợp suy biến>: Else Begin <tiền xử lý đệ quy>; <goi dé quy>; <xử lý hậu đệ quy>; End
1.4 NGUYÊN TAC HOẠT ĐỘNG CỦA GIẢI THUẬT ĐẸ QUY
1.4.1 Khái niệm Stack
Stack là một cấu trúc lưu trữ, hoạt động theo nguyên tắc sau: - Mãi lần nộp vào hoặc lay ra chỉ thực hiện với một phần ty
- Phan tir nop vào sau sẽ được lấy ra trước
Push 1 / Pop
Hinh 1.3 Stack thể hiện cách lưu trữ của giải thuật đệ quy 1.4.2 Nguyên tắc hoạt động của giải thuật đệ quy
- Khi thực hiện một giải thuật đệ quy thì các bước của giải thuật đệ quy sẽ lần
Trang 21- Khi gặp lời gọi đệ quy thì trước khi thực hiện lời gọi đệ quy, đoạn mã lệnh chưa được thực hiện xong cùng với các đối tượng dữ liệu liên quan tại thời điểm
này sẽ được lưu vào stack
- Đến lúc nào đó không thể thực hiện lời gọi đệ quy nữa thì các đối tượng duoc lu trong Stack sé lần lượt được lấy ra đề xử lý
Ví dụ: Hàm tính giai thừa của một số tự nhiên n, quy trình thực hiện như sau: - Khi có lệnh gọi hàm, chang han: n := gt(3);
- Thi may sẽ ghi nhớ là: gt(3) := 3 * gt(2); và di tinh gt(2)
- Kế tiếp máy lại ghi nhớ: gt(2):= 2*gt(1):và đi tính gt(1)
- Theo định nghĩa của hàm thì khi gt(1):= 1;
- Máy sẽ quay ngược lại: gt(2):= 2 * 1; và cho kết quả là 2 - Tiếp tục: g†(3) := 3 * 2; cho kết quả là 6
- Như vậy kết quả cuối cùng trả về là 6 Ta có: 3l = 6
1.5 UU DIEM VA HAN CHE CUA GIAI THUAT DE QUY
Kỹ thuật đệ quy là một trong những kỹ thuật lập trình thông dụng và thường được dùng phổ biến ở nhiều chương trình lập trình Tuy nhiên tùy thuộc vào mỗi loại bài toán mà kỹ thuật này có những ưu điểm và nhược điểm riêng, cho nên có những bài toán cần phải dùng đệ quy để giải quyết đơn giản và ngược lại có những bài tốn khơng nên dùng đệ quy vì sẽ làm cho chương trình chạy châm và tốn nhiều bộ nhớ [4]
1.5.1 Ưu điểm
- Viết chương trình ngắn gọn, dễ hiều, lộ rõ bản chất đệ quy
- Rất thuận tiện để giải quyết các bài toán có bản chất đệ quy như bài toán duyệt cây, tháp Hà Nội
- Ngắn gọn, có khả năng định nghĩa một tập hợp rất lớn các đối tượng bằng
Trang 22- Hầu hết các ngôn ngữ lập trình đều hỗ trợ kỹ thuật đệ quy
1.5.2 Hạn chế
- Đệ quy tốn nhiều bộ nhớ vì cứ mỗi lần gọi đệ quy lại cần thêm một vùng nhớ mới trong khi vùng nhớ cũ vẫn được duy trì
- Do đệ quy lưu trữ các đữ liệu trung gian vào Stack nên nếu lưu nhiều bộ đữ liệu lớn trên Stack có thê gây ra hiện tượng tràn Stack
- Tốn nhiều thời gian dé thực hiện chương trình
1.6 MỌT SÓ BÀI TOÁN GIẢI BẰNG PHƯƠNG PHÁP ĐẸ QUY
1.6.1 Tính giai thừa của một số nguyên dương n * Thuật toán:
- Theo định nghĩa n! = n.(n-1).(n-2) 3.2.1, nếu n=0 thi n!=1 Dé thấy
n!=n.(n-1)! Như vậy giai thừa của một số n sẽ bằng tích của chính nó với giai thừa
của số liền trước (n-l), tức là việc tính giai thừa sẽ được lặp lại với n lùi dần đến khi
Trang 25Ifk = 0 then gt := 1 else gt :-=k * gt(k - 1); End; Function Tong(i: Word): Longint; Begin
Ifi = 1 then Tong := 1
else Tong := giaithua() + Tong(i - 1); End; Procedure Ghi; Begin Assign(f,fo); Rewrite(f); Writeln(f,Tong(n)); Close(f); End; Begin Doc; Ghi; End 1.6.3 Tính lũy thừa: a" với n là một số nguyên dương * Thuật toán: e Tham số hóa bài toán: a°=]
Nếu n > 0 thi luythua = a*luythua(n-1)
Trang 27Close(f); End; Begin Doc; Ghi; End 1.6.4 Tìm số fibonaxi thứ n * Thuật toán:
- Từ định nghĩa, các số Fibonacci là một dãy số, kí hiệu F(n) (n là số nguyên
không âm), được định nghĩa một cách đệ quy theo công thức sau:
ñ, „=Ũ Fix) =91, n=l
F(e-D+h@-2), mm]
Vi vay ta dễ dàng xây dựng thuật toán đệ quy dé tinh sé Fibonaci thứ n: e Tham số hóa bài toán:
Fibonaci(0) = 0 Fibonaci(1) = 1
Néu n > 1 thi Fibonaci = Fibonaci(n-2)+ Fibonaci(n-1)
e Phat hién trường hợp suy biến và tìm giải thuật cho tình huống này
Nếu n =0 hoặc n = l thì Fibonaci := 1
e _ Phân rã bài toán tổng quát theo hướng đệ quy Fibonaci = Fibonaci(n-2)+ Fibonaci(n-1)
Néu n> 1 thi Fibonaci = Fibonaci(n-2)+ Fibonaci(n-1) * Chuong trinh
Program Fibonaxi;
Trang 291.6.5 Bài toán tháp Hà Nội
Đề bài: Có 3 cái cọc, đánh dau A, B, C và N cái đĩa Mỗi đĩa đều có một lỗ
chính giữa để đặt xuyên qua cọc, các đĩa đều có kích thước khác nhau Ban đầu tất
cả đĩa đều được đặt ở cọc thứ nhất theo thứ tự đĩa nhỏ hơn ở trên
Yêu cầu của bài là chuyển tất cả các đĩa từ cọc A qua cọc C với ba ràng buộc như sau:
1 Mỗi lần chỉ chuyên được một đĩa
2 Khi chuyển có thể dùng cọc trung gian B
3 Trong suốt quá trình chuyển các chồng đĩa ở các cột luôn được xếp đúng
tức là đĩa có kích thước bé được đặt trên đĩa có kích thước lớn Phân tích bài toán:
Trong bài toán trên hình dung một lời giải tổng quát cho trường hợp tông quát N đĩa là không dễ dàng
Hãy bắt đầu với các trường hợp đơn giản:
- Với N = 1: Chỉ cần chuyên đĩa này từ cọc A qua coc C là xong
- Voi N = 2: Dé đảm bảo ràng buộc đĩa nhỏ luôn xếp ở trên ta bắt buộc chuyển đĩa trên cùng từ cọc A qua cọc B Chuyển tiếp đĩa còn lai tir coc A qua coc C Chuyên tiếp đĩa đang ở cọc B sang cọc C
- Voi N =3: Ta phải thực hiện 7 bước như sau:
Trang 30* Nhan xét:
Ở kết quả của bước thứ ba Đây là một kết quả quan trọng vì nó cho ta thay từ trường hợp N=3 bài toán đã được phân chia thành hai bài toán với kích thước nhỏ hơn: đó là bài toán chuyển 1 đĩa từ cọc A qua cọc C lấy cọc B làm trung gian và bài toán chuyển 2 đĩa (dời) từ cọc B sang cọc C lấy cọc A làm trung gian Hai bài toán con này đã biết cách giải (trường hợp N=I và trường hợp N=2)
Từ nhận xét trên cho ta cách chuyên đĩa trong trường hợp tổng quát: Bước 1: Chuyển n-l đĩa từ cọc A sang cọc B lấy cọc C làm trrung gian
Bước 2: Chuyển một đĩa từ cọc À sang cọc C
Bước 3: Chuyển n-l đĩa từ cọc B sang cọc C lấy cột A làm trung gian
Như vậy bài toán đối với n cái đĩa ở trên được đệ quy về bài toán n-l cái đĩa và bài toán l cái đĩa Quá trình đệ quy sẽ dừng lại khi n=0
Trang 321.7 TIEU KET CHUONG 1
Chương này đã đề cập đến các nội dung cơ bản về thuật toán đệ quy như: Khái niệm về đệ quy, giải thuật đệ quy, chương trình con đệ quy, nguyên tắc hoạt
động của giải thuật đệ quy, ưu điểm và hạn chế của giải thuật đệ qui, một số bài
toán cơ bản giải bằng phương pháp đệ quy
Trang 33CHƯƠNG 2 GIỚI THIỆU VÈ PHƯƠNG PHÁP ĐẸ QUY QUAY LUI
Trong chương này giới thiệu về phương pháp đệ quy quay lui Nội đung chương tập trung tìm hiểu ý tưởng, phương pháp và thuật toán đệ quy quay lui
2.1 GIẢI BÀI TOÁN BẰNG PHƯƠNG PHÁP ĐẸ QUY QUAY LUI 2.1.1 Khái niệm
Kĩ thuật quay lui (backtracking) như tên gọi của nó, là một quá trình phân tích đi xuống và quay lui trở lại theo con đường đã đi qua Bằng việc liệt kê các tình huống, thử các khả năng có thể có cho đến khi tìm thấy một lời giải đúng, thuật toán quay lui chia nhỏ bài toán, lời giải của bài toán lớn sẽ là kết quả của việc tìm kiếm theo chiều sâu của các bài toán phần tử Trong suốt quá trình tìm kiếm nếu gặp phải một hướng nào đó mà biết chắc không thể tìm thấy đáp án thì quay lại bước trước đó và tìm hướng khác kế tiếp hướng vừa tìm đó Trong trường hợp không còn một hướng nào khác nữa thì thuật toán kết thúc [2]
Thuật toán quay lui có thể được thể hiện theo sơ đồ cây tìm kiếm theo chiều
Trang 34Từ hình vẽ, dẽ dàng nhận thấy:
- Ở một bài toán hiện tại (mỗi nốt), ta đi tìm lời giải cho bài toán đó Ứng VỚI
lời giải, ta đi giải bài toán kế tiếp cho đến khi bài toán gốc trở nên đầy đủ
- Lời giải của bài toán gốc thường là một lối đi từ gốc đến nốt cuối cùng (không có nốt con)
2.1.2 Ý tưởng
Nét đặc trưng của phương pháp quay lui là các bước hướng tới lời giải cuối cùng của bài tốn hồn tồn được làm thử
- Tại mỗi bước, nếu có một lựa chọn thì ghi nhận lại lựa chọn này và tiến hành các bước thử tiếp theo Còn ngược lại không có lựa chọn nảo thích hợp thì quay lại bước thử trước, xóa bỏ sự ghi nhận và quay lại chu trình thử với các lựa chọn còn lại
- Hành động này được gọi là quay lui, thuật toán thê hiện phương pháp này gọi là thuật tốn quay Ìu1
- Điểm quan trọng của thuật toán là phải ghi nhớ tại mỗi bước đi qua để tránh trùng lặp khi quay lui Dễ thấy là các thông tin này cần được lưu trữ vào một ngăn xếp, nên thuật toán thể hiện ý thiết kế một cách đệ quy
- Thuật toán quay lui thường được cài đặt theo lối đệ quy, mỗi lần gọi hàm đệ quy, hàm đệ quy được truyền một tham số (trong các tham số) là chỉ số của bài toán con, trong hàm sẽ cố gắng tìm lời giải cho bài toán con đó, nếu tìm thấy thì gọi hàm đệ quy để giải bài toán con tiếp theo hoặc là đưa ra đáp án bài toán lớn nếu đã đầy đủ lời giải, nếu không tìm thấy thì chương trình sẽ trở về điểm gọi hàm
đó Mục đích của việc sử dụng hàm đệ quy là để thuật toán được rỏ ràng, dễ viết, dễ
hiệu hơn và cũng dé bảo toàn các biến, các trạng thái lúc giải bài toán con
Lời giải của bài toán thường biểu điễn bằng một vec tơ gồm n thành phần x =
(Xi, Xa, ,Xn) phải thỏa mãn các điều kiện nào đó Để chỉ ra lời giải x, ta phải xây
Trang 35- Tai méi buéc thir i:
+ Đã xây dựng xong các thành phần xị, X2, , Xi-I
+ Xây dựng thành phần xi bằng cách lần lượt thử tất cả các khả năng mà xi
có thể chọn :
Nếu một khả năng j nào đó phù hợp cho xi thì xác định xi theo khả năng j Thường phải có thêm thao tác ghi nhận trạng thái mới của bài toán dé hồ trợ cho
budc quay lui Néu i =n thi ta có được một lời giải, ngược lại thì tiến hành bước ¡+1 dé xac dinh xi+1
Néu không có một khả năng nào chấp nhận duoc cho x; thi ta lui lai bước
trước (bước i-1) dé xác định lại thành phan x:.1
Dé don giản, ta giả định các khả năng chọn lựa cho các xị tại mỗi bước là
như nhau, do đó ta phải có thêm một thao tác kiểm tra khả năng j nào là chấp nhận
duoc cho xi
Mô hình của phương pháp quay lui có thể viết bằng thủ tục sau, với n là số
bước cần phải thực hiện, k là số khả năng mà XI có thể chọn lựa
Trang 36End;
Tìm nghiệm bằng phương pháp quay lui có thể chuyển về việc tìm kiếm trên cây không gian các trạng thái, với cây được xây dựng từng mức như sau:
Các con của gốc (thuộc mức 1) 1a khả năng có thể chọn cho xi
Gia sử xi là một nút ở mức thứ 1-1, khi đó các nút con của xi là các khả nang ma xj cd thể chọn, một khi đã tìm được các thành phần XI, , X1
Như vậy, mỗi nút x¡ của cây biểu diễn một lời giải bộ phận, đó là các nút
nằm trên đường đi từ gốc đến nút đó
Ta có thể nói việc tìm kiếm nghiệm bằng phương pháp quay lui chính là tìm kiếm theo chiều sâu trên cây không gian các trạng thái
Mức l
Mức 2
Mức 3
Hình 2.2 Cây tìm kiếm theo chiều sâu thể hiện phương pháp quay lui 2.1.3 Mô hình của bài toán
Lời giải của bài toán thường biểu điễn bằng một véc tơ gồm n thành phần phải thỏa mãn các điều kiện nào đó Đề chỉ ra lời giải x, ta phải xây đựng dần
các thành phan loi giai X=(X1, Xo, Xn)
Trang 37- Tại mỗi bước ¡:
- Đã xây dựng xong các thành phan X=(X1, Xa, , XÙ
- Xây dựng thành phần x¡ bằng cách lần lượt thử tất cả các khả năng mà xị
có thể chọn:
+ Nếu một khả năng j nào đó phù hợp cho xị thì xác định x; theo khả năng j Thường phải có thêm thao tác ghi nhận trạng thái mới của bài toán để hỗ trợ cho
bước quay lui Nếu ¡ = n thì ta có được một lời giải, ngược lại thì tiến hành bước ¡+1 đê xác dinh xj
+ Nếu không có một khả năng nào chấp nhận duoc cho x; thi ta lui lại
bước trước (bước i-1) để xác định lại thành phần xị_¡,
2.2 PHƯƠNG PHÁP GIẢI BÀI TOÁN BẰNG PHƯƠNG PHÁP QUAY LUI
Sử dụng thuật toán quay lui dùng để giải bài toán liệt kê các cấu hình Mỗi cấu hình được xây đựng bằng cách xây dựng từng phần tử, mỗi phần tử được chọn bằng cách thử tất cả các khả năng [2]
2.2.1 Phương pháp
Giả thiết cấu hình cần liệt kê có dạng (Xi, X¿, xa) Khi đó thuật toán
quay lui được thực hiện qua các bước sau:
Bước 1: Xét tất cả các giá trl x1 co thể nhận, thử cho xị nhận lần lượt các
giá trị đó Với mỗi giá trị thử cho xị ta sẽ làm tiếp Bước 2
Bước 2: Xét tất cả các giá trỊ Xa co thể nhận, lại thử cho xz nhận lần lượt
các giá trị đó Với mỗi giá trị thử gán cho xa lại xét tiếp các khả năng chọn xa cứ tiếp tục như vậy đến bước thứ n,
Trang 382.2.2 Giai thuat téng quat
- Thuật toán quay lui có thể được mô tả bằng đoạn mã sau (thủ tục này thử
cho x¡ nhận lần lượt các giá †rỊ mà nó có thể nhận):
Procedure Try(), {Thử xem xi sẽ nhận giá trị nào} Begin
For <mỗi khả năng j của x‡> do Begin If <chấp nhận> then
Begin <Xac dinh x; theo j>;
if i=n then <Ghi nhan mot loi giai> else Try (+1); [<Huỷ việc xác dinh x; theo j>;] End; End; End;
(Thuật toán quay lui sẽ bắt đầu bằng lời gọi Try(1)) - Một cách khác để mơ tả thuật tốn quay lui như sau:
+ Đầu tiên, Try() là hàm đệ quy quay lui trong đó ¡ là biến chạy từ l.n tương ứng với số thứ tự của Xị, Xa, Xa, ., xa theo phương pháp đệ quy
+ Tiếp theo vòng lặp for cho các giá trị của từng phần tử xị, xa, xa, TẤt nhiên, đối với mỗi bài toán riêng thì những giá trị này là khác nhau
+ Trạng thái cuối tức là điểm dừng của thuật toán này Thực chất thuật toán
quay lui cũng là đệ quy nên việc xác định điểm dừng cực kỳ quan trọng và luôn luôn phải có
Trang 39nhiên, khi xuất ra nó lại xuất tới nhiều dãy số (tùy từng bài tập) Lý do, nếu đề ý thì chúng ta sẽ thấy phía trên có I vòng for, nó sẽ hoạt động giống như kiểu nhiều vòng lặp for lồng nhau Fori:=l ton do For j:=1 ton do For z:=1 ton do xuat()
Với m vòng for lồng nhau như vậy sẽ xuất ra n^m lần
Như vậy nếu không đặt điều kiện nào thì vòng for đầu tiên sẽ là m lần, tiếp theo trong mỗi lần đó lại có m lần for khác
Tóm lại, trong thủ tục mô tả trên, điều quan trọng nhất là đưa ra được một
danh sách các khả năng để cử và xác định được giá trị của biểu thức logic [ chấp nhận x[ï] ] Dễ thấy rằng bài tốn vơ nghiệm khi ta đã duyệt hết mọi khả năng mà không có khả năng nào thoả mãn yêu cầu Chú ý rằng là đến một lúc nào đó thuật toán phải lùi liên tiếp nhiều lần Từ đó suy ra rằng, thông thường bài tốn vơ
nghiệm khi không thê lùi được nữa
2.3 MỘT SÓ BÀI TOÁN QUEN THUỌC GIẢI BẰNG PHƯƠNG PHÁP ĐẸ
QUY QUAY LUI
Quay lui là một kỹ thuật thiết kế giải thuật đựa trên đệ quy Ý tưởng của quay lui là tìm lời giải từng bước, mỗi bước chọn một trong số các lựa chọn khả dĩ và đệ quy Có vẻ vẫn chưa được rõ ràng lắm Giờ chúng ta xem xét một vài ví dụ và khái quát hóa phương pháp quay lui
2.3.1 Bài toán liệt kê dãy nhị phân độ dài n
Trang 40Output: File văn bản NHIPHAN.OUT ghi các dãy nhị phân, mỗi dãy trên một dòng Ví dụ: N=3 NHIPHAN.INP NHIPHAN.OUT 3 000 001 010 011 100 101 110 111 * Nhận xét: Các yếu tố của bài toán cho phép sử dụng thuật toán đệ quy quay lui
- Bài toán yêu cầu ta đi liệt kê tất cả các dãy nhị phân có độ dài n Vậy mỗi
kết quả là một bộ x = (Xi, Xa, ., Xn) Với Xi là các số thuộc tập hợp {0,1}, cac phần tu x; có lặp và có phân biệt thứ tự
- Độ phức tạp của thuật toán là O(2")
* Ý tưởng:
Biểu diễn dãy nhị phân độ dài N dưới dạng xi,Xa, ,Xa trong do xi € {0,1} Ta
sẽ liệt kê các dãy này bằng cách thử gán cho x; cdc giá trị {0,1} Với mỗi giá trị thử
gan cho x; ta lai thir cac gia tri co thé gan cho xj+1, vi các phan tử được chọn đưa vào
có thể lặp nên các giá trị này mặc nhiên được chấp nhận mà không cần điều kiện gì vì vậy bài toán không cần biến trạng thái
Ý tưởng của phương pháp quay lui là chúng ta sẽ chọn ra một phần tử lưu