Hàm và Thủ tục Phát triển chương trình bằng phương pháp tinh chỉnh dần từng bước. Định nghĩa và sử dụng hàm trong ngôn ngữ C Hàm đệ quy Sức mạnh của đệ quy là gì? Lời giải của bài toán T gọi là đệ quy nếu nó được thực hiện bằng lời giải của bài toán T’ có dạng giống T Giải thuật tương ứng với lời giải đệ quy gọi là giải thuật đệ quy. Biểu diễn giải thuật đệ quy: trong chương trình cần có thủ tục hay chương trình con. ...
KỸ THUẬT LẬP TRÌNH KHÁI NIỆM ĐỆ QUY KỸ THUẬT PHÁT TRIỂN CHƯƠNG TRÌNH ? Sức mạnh đệ quy gì? Lời giải tốn T gọi đệ quy thực lời giải tốn T’ có dạng giống T NỘI DUNG Hàm Thủ tục Phát triển chương trình phương pháp tinh chỉnh dần bước Giải thuật tương ứng với lời giải đệ quy gọi giải thuật đệ quy Biểu diễn giải thuật đệ quy: chương trình cần có thủ tục hay chương trình Định nghĩa sử dụng hàm ngơn ngữ C Hàm đệ quy • Đệ quy trực tiếp: thủ tục P có chứa lời gọi đến • Đệ quy gián tiếp: thủ tục P có lời gọi thủ tục Q Q có lời gọi đến P • Cần xác định tình huống, điều kiện để kết thúc đệ quy Ví dụ Hàm tính giai thừa • 5! = * * * * 1 ? Bài tốn dùng đệ quy? Hàm đệ quy thường viết theo thuật tốn sau: if (trường hợp suy biến) { • Chú ý rằng: Lời giải toán trường hợp suy biến; – 5! = * 4! } – 4! = * 3! else { • Có thể thực gọi đệ qui Gọi đệ quy tới hàm với giá trị khác tham số; • Điều kiện kết thúc gọi đệ qui: 1! = 0! = } – 2! = * 1! = * = 2; – 3! = * 2! = * = 6; VÍ DỤ VỀ CHƯƠNG TRÌNH ĐỆ QUY Ví dụ Hàm giai thừa Fin a l va lue = 120 5! 1, if n = ⎧ Fac ( n) = ⎨ if n > ⎩n * Fac ( n − 1), 5! * 4! * 3! function Fac(i: integer): integer; * 2! begin * 1! if i 2) • Chuyển (n−1) đĩa từ cột A sang cột B − Được phép dùng cột B để làm trung gian • Chuyển đĩa thứ n từ cột A sang cột C • Chuyển (n − 1) đĩa từ cột B sang cột C 18 19 BÀI TOÁN THÁP HÀ NỘI BÀI TOÁN THÁP HÀ NỘI Procedure HanoiTower(n, A, B, C: byte) Begin Các thuật toán “ Chia để trị” (Divide−and−Conquer) Call HanoiTower(n−1, A, C, B); • Để giải tốn B với liệu S, ta chia s thành liệu S1, S2, …, Sk mà với liệu này, toán B giải thuật tốn đơn giản Sau tổ hợp lời giải toán liệu Si cho lời giải toán B với liệu S Call HanoiTower(1, A, B, C); • Thường sử dụng lời gọi đệ quy if n = then Chuyển đĩa từ A sang C else begin Call HanoiTower(n − 1, B, A, C); end; 20 THUẬT TỐN QUAY LUI 21 KHI NÀO KHƠNG SỬ DỤNG ĐỆ QUY? Thuật ngữ: Backtracking [D.H Lehmer, 1950] Cải tiến từ thuật tốn tìm kiếm thơ function Fac(i: integer): integer; {lưu ý nên dùng số nguyên lớn} Tìm kiếm có hệ thống, theo chiều sâu, tập phương án begin “Thử sai” Thường sử dụng đệ quy Các ví dụ: Thuật toán đệ quy if i =0) Những mơ hình toán nên tránh dùng đệ quy: s(n) = (2n)! Viết chương trình sử dụng hàm đệ quy để tính UCLN hai số nguyên dương theo quy tắc sau: P ≡ if B then S; P end; hay P ≡ S; if B then P end; • Nếu x= y UCLN(x, y) = x • Nếu x > y UCLN(x, y) = UCLN(x − y, y); • Nếu x < y UCLN(x, y) = UCLN(x, y −x); 26 27 BÀI TẬP Viết chương trình sử dụng hàm đệ quy để vẽ đường Hilber cấp k (k nhập vào từ bàn phím) Viết chương trình sử dụng đệ quy để giải tốn Tháp Hà Nội 28 ... D(i−1); end; 14 15 VÍ DỤ VỀ CHƯƠNG TRÌNH ĐỆ QUY procedure B(i:integer); procedure C(i:integer); procedure D(i:integer); Chương trình VÍ DỤ VỀ CHƯƠNG TRÌNH ĐỆ QUY Begin read(n, x, y, h);... Call HanoiTower(n − 1, B, A, C); end; 20 THUẬT TỐN QUAY LUI 21 KHI NÀO KHƠNG SỬ DỤNG ĐỆ QUY? Thuật ngữ: Backtracking [D.H Lehmer, 1950] Cải tiến từ thuật tốn tìm kiếm thơ function Fac(i: integer):... KHÔNG SỬ DỤNG ĐỆ QUY? Đệ qui lặp: Thuật tốn khơng đệ quy (Sử dụng vịng lặp) function Fac2(i: integer):integer; Lặp • Lặp: rõ ràng, kiểm sốt q trình chạy chương trình begin • Đệ qui: lặp lại lời