Tài liệu bồi dưỡng học sinh giỏi THPT – Môn Tin học Phần II: Chuyên đề nâng cao CHUYÊN ĐỀ NÂNG CAO CHUYÊN ĐỀ 4: ĐỆ QUY VÀ ĐỆ QUY QUAY LUI A ĐỆ QUY I LÝ THUYẾT ĐỆ QUY Vấn đề Đệ quy gì? Vấn đề Đệ quy vấn đề định nghĩa nó, ví dụ: • Tính tổng S(n) (tính tổng n số nguyên dương đầu tiên) định nghĩa thông qua S(n-1) (tính tổng n1 số nguyên dương đầu tiên) • Tính P(n) ( tính xn) định nghĩa thông qua P(n-1) (tính (xn-1) Vấn đề Đệ quy thường giải qua hai bước bước phân tích bước ngược Bài toán (hay vấn đề) giải theo phương pháp Đệ quy cần hai điều kiện sau để hữu (tồn tại) tính Đệ quy không bị gọi Đệ quy bất tận (bị loop): 1) Để hữu (tồn tại) tính Đệ quy – nghĩa để giải toán phải giải toán đồng dạng, để giải toán đồng dạng phải giải toán đồng dạng khác – phải tồn bước Đệ quy Bài toán có bước Đệ quy S(n) = S(n-1) + n, toán có bước Đệ quy xn=xn-1*x 2) Để không bị gọi Đệ quy bất tận (bị loop) phải có điều kiện dừng Bài toán có điều kiện dừng S(1) = 1, toán có điều kiện dừng x0 =1 => Bài toán Đệ quy toán phân rã thành toán nhỏ hơn, đơn giản có dạng với toán ban đầu Những toán nhỏ lại phân rã thành toán nhỏ Cứ vậy, việc phân rã dừng lại toán đơn giản đến mức suy kết mà không cần phải phân rã Ta phải giải tất toán kết hợp kết lại để có lời giải cho toán lớn ban đầu Cách phân rã toán gọi "chia để trị" (devide and conquer), dạng Đệ quy Chương trình Đệ quy Một chương trình (hàm thủ tục) gọi Đệ quy trình thực có phần phải gọi đến Ví dụ 1: Hàm tính lũy thừa nguyên số thực x (tính xn) Function LT(x: real, n: integer): real; Begin If n=0 then LT:=1 else LT:=LT(x,n-1)*x; End; Khi có lệnh gọi hàm, chẳng hạn: a:=LT(3,4); Thì máy nhớ là: LT(3,4):=3*LT(3,3) tính LT(3,3); Kế tiếp máy lại phải ghi nhớ: LT(3,3):=3*LT(3,2) tính LT(3,2); Kế tiếp máy lại phải ghi nhớ: LT(3,2):=3*LT(3,1) tính LT(3,1); Kế tiếp máy lại phải ghi nhớ: LT(3,1):=3*LT(3,0) tính LT(3,0); Theo định nghĩa hàm LT: LT(3,0):=1; Máy quay ngược lại: LT(3,1):=3*1=3; Rồi tiếp tục quy ngược lại: LT(3,2):=3*3=9; LT(3,3):=9*3=27; LT(3,4):=27*3:=81; Ví dụ 2: Hàm tính giai thừa n (tính n!) Giáo viên: Lê Thanh Phú 1|Tra n g Phuleethanh@gmail.com Tài liệu bồi dưỡng học sinh giỏi THPT – Môn Tin học Function GT(n: word): longint; Begin If n=1 then GT:=1 Else GT:=GT(n-1)*n; End; Phần II: Chuyên đề nâng cao Cấu trúc chương trình Đệ quy Một chương trình Đệ quy gồm phần: (1) Phần cố định – Phần Neo (điều kiện dừng): Trong chứa tác động hàm thủ tục với với số giá trị thể ban đầu tham số để dừng đệ quy Trong ví dụ 1: If n=0 then LT:=1; Trong ví dụ 2: If n=1 then GT:=1; (2) Phần hạ bậc đệ quy Trong tác động cần thực cho giá trị thời tham số định nghĩa tác động định nghĩa trước với kích thước nhỏ tham số: Trong ví dụ 1: If n > then LT:=LT(x,n-1)*x; Trong ví dụ 2: If n > then GT:=GT(n-1)*n; Nguyên tắc hoạt động giải thuật đệ quy Khái niệm stack: Stack cấu trúc lưu trữ, hoạt động theo nguyên tắc sau: Mỗi lần nộp vào lấy thực với phần tử Phần tử nộp vào sau lấy trước Nguyên tắc hoạt động: • Khi thực giải thuật đệ quy bước giải thuật đệ quy thực • Khi gặp lời gọi đệ quy trước thực lời gọi đệ quy, đoạn mã lệnh chưa thực xong với đối tượng liệu liên quan thời điểm lưu vào stack • Đến lúc thực lời gọi đệ quy đối tượng lưu stack lấy để xử lý Ví dụ: Trong ví dụ trên, qui trình thực sau: • Khi có lệnh gọi hàm, chẳng hạn: x := gt(3); máy ghi nhớ là: gt(3) := * gt(2); tính gt(2) • Kế tiếp máy lại ghi nhớ: gt(2):= 2*gt(1); tính gt(1) • Theo định nghĩa hàm gt(1):= 1; máy quay ngược lại: gt(2):= * 1; cho kết • Tiếp tục: gt(3) := * 2; cho kết • Như kết cuối trả Ta có: 3! = Ưu điểm hạn chế đệ quy Ưu điểm: Mô tả số thao tác tính toán thông qua đoạn lệnh ngắn, làm cho chương trình ngắn gọn, dễ hiểu, lộ rõ chất đệ quy Rất thuận tiện để giải toán có chất đệ quy Hiện có nhiều thuật toán chưa có lời giải đệ quy Nhiều giải thuật dễ mô tả dạng đệ quy lại khó mô tả với giải thuật không-đệ-quy Một chương trình viết theo giải thuật có tính đệ qui mang tính "người" hơn, sáng sủa, dễ hiểu, nêu bật chất vấn đề Hạn chế: Vừa tốn nhớ, chương trình chạy chậm Giáo viên: Lê Thanh Phú 2|Tra n g Phuleethanh@gmail.com Tài liệu bồi dưỡng học sinh giỏi THPT – Môn Tin học Phần II: Chuyên đề nâng cao Do đệ quy lưu trữ liệu trung gian vào Stack nên Lưu nhiều liệu lớn stack nên gây tượng tràn Stack II MỘT SỐ BÀI TẬP: Yêu cầu: Các tập sau cần xây dựng chương trình đệ quy Viết chương trình tính N! (Có sử dụng chương trình dạng đệ quy) Hướng dẫn: Trường hợp không sử dụng đệ quy, theo cách bình thường ta có chương trình tính n! sau: Function GT(n:longint):longint; Var i:longint Begin GT:=1; For i:=1 to N GT:=GT*i; End; Trường hợp sử dụng đệ quy ta viết sau Function GT(n:longint):longint; Begin If n=0 then GT:=1 else GT:= n * GT(n-1); End; Chương trình: Tự viết Viết chương trình tìm số Fibonaci thứ n HD: Sử dụng đ/n dãy Fibonaci ta có • F1 = F2 = • Fn = Fn-1 + Fn-2 Viết chương trình tính S: 1 s = + + + + n Viết chương trình tính S = + 1.2 + 1.2.3 + 1.2.3.4 + … + 1.2.3…n Viết chương trình tìm ước chung lớn hai số a b Hãy tính tổng chữ số số nguyên dương N Tính S(n) = 1/2 + 1/4 + + 1/2n Tính S(n) = + 1/3 + 1/5 + + 1/(2n+1) Tìm số đảo ngược Ví dụ: Số 2345 in kết đảo ngược 5432 10 Tính S(n) = 1/2 + 2/3 + 3/4 + + n/(n+1) 11 Tính S(n) = 1/2 + 3/4 + 5/6 + + (2n+1)/(2n+2) 12 Tính lũy thừa số: S(x,n) = x^n 13 Độ bền số nguyên không âm n định nghĩa sau: - Nếu N có chữ số độ bền n - Nếu N có từ chữ số trở lên độ bền n độ bền số nguyên tích chữ số n cộng Viết chương trình nhập số n (0 ≤ n ≤ 1000) từ bàn phím, tìm số bé n có độ bền lớn Ví dụ: Với n = 100 in kết quả: So be hon 100 co ben lon nhat la: 77 • Giải thích: Doben(77)=Doben(49)+1=Doben(36)+1+1=Doben(18)+1+1+1 = Doben(8)+1+1+1+1=0+1+1+1+1=4 Giáo viên: Lê Thanh Phú 3|Tra n g Phuleethanh@gmail.com Tài liệu bồi dưỡng học sinh giỏi THPT – Môn Tin học Phần II: Chuyên đề nâng cao Viết chương trình nhập vào số n thông báo độ bền Giáo viên: Lê Thanh Phú 4|Tra n g Phuleethanh@gmail.com Tài liệu bồi dưỡng học sinh giỏi THPT – Môn Tin học Phần II: Chuyên đề nâng cao B ĐỆ QUY QUAY LUI (BACK TRACKING) I LÝ THUYẾT Sơ lược đệ quy quay lui Trong lập trình, phương pháp giải toán tổng quát ý Đó việc xác định giải thuật để tìm lời giải cho số toán không theo luật tính toán cố định phương pháp "Try and Error" (Thử sai) Nét đặc trưng phương pháp chỗ bước đến lời giải hoàn toàn cách làm thử Nếu có lựa chọn chấp nhận ghi nhớ thông tin cần thiết bước thử Trái lại, lựa chọn thích hợp làm lại bước trước, xoá bớt ghi nhớ quay chu trình thử với lựa chọn lại Hành động gọi quay lui (Back tracking) giải thuật thể phương pháp gọi giải thuật quay lui Sử dụng đệ quy quay lui trường hợp nào: Thường sử dụng chương trình - cần liệt kê kết - Cần duyệt qua phương án để tìm phương án tối ưu (Bài 9, toán đặt hòm phiếu ) - Tìm phương án – Thử Tìm thấy phương án dừng (Ví dụ: Có N bò, hỏi hàng cho hai bò đực phải đứng cách k bò cái) Ví dụ: Liệt kê hoán vị số N, Bài toán tám quân hậu, liệt kê dãy nhị phân độ dài N … Cấu trúc Đệ quy quay lui: Procedure Try(j); {Chọn thực bước thứ j} Begin For CÁC PHƯƠNG ÁN CHỌN If CHỌN ĐƯỢC then Begin - THỰC HIỆN BƯỚC ĐI THỨ j; - IF THÀNH CÔNG then THÔNG BÁO KẾT QUẢ - HỦY BƯỚC ĐI THỨ j; {Quay lui} End; End; Else Try(j+1); II BÀI TẬP: Liệt kê tất hoán vị tập {1,2, …, N}: N! Ví dụ: N=3 tất hoán vị là: 123, 132, 213, 231, 312, 321 (Tệp DQQL_Bai1.inp lưu số tự nhiên N, Tệp DQQL_Bai1.out lưu hoán vị) Lập trình đọc số n từ tệp, tìm lưu tất dãy nhị phân có độ dài n Ví dụ: N=3 000,001,010,011,100,101,110,111 Lập trình tìm tất chỉnh hợp không lặp chập K N phần tử n!/(n-k)! DQQL_Bai3.inp DQQL_Bai3.out 24 12 1345 13 14 15 31 34 35 41 43 45 51 53 54 Lập trình tìm tất chỉnh hợp lặp chập K N phần tử: n^k DQQL_Bai4.inp DQQL_Bai4.out 23 Giáo viên: Lê Thanh Phú 5|Tra n g Phuleethanh@gmail.com Tài liệu bồi dưỡng học sinh giỏi THPT – Môn Tin học 124 Phần II: Chuyên đề nâng cao 11 12 14 21 22 24 41 42 44 Bài Bài toán tám quân hậu: Xét bàn cờ kích thước 8x8 Hỏi có cách đặt quân hậu lên bàn cờ cho chúng ăn lẫn Bài 6: Đảo chữ Bạn phải viết chương trình đưa tất từ có phát sinh từ tập chữ Ví dụ: Cho từ “abc”, chương trình bạn phải đưa từ "abc", "acb", "bac", "bca", "cab" "cba" (bằng cách khảo sát tất trường hợp khác tổ hợp ba chữ cho) Input Dữ liệu vào cho tệp input.txt chứa số từ Dòng số tự nhiên cho biết số từ cho Mỗi dòng chứa từ Trong đó, từ chứa chữ thường hoa từ A đến Z Các chữ thường hoa coi khác Một chữ xuất nhiều lần Output Với từ cho file Input, kết nhận file Output phải chứa tất từ khác sinh từ chữ từ Các từ sinh từ từ cho phải đưa theo thứ tự tăng dần bảng chữ DQQL_Bai6.inp DQQL_Bai6.out abc acb bac bca cab cba acb aac aca caa aac Bài 7: Trò chơi Line Trò chơi Line trò chơi di chuyển viên bi hình vuông x ô Bi ăn tạo thành hàng, cột, đường chéo gồm viên bi liên tiếp màu Một thuật toán sử dụng trò chơi tìm đường để di chuyển viên bi Giả sử trò chơi Line tổng quát có n dòng, n cột Đánh số dòng từ đến n theo thứ tự từ xuống dưới, đánh số cột từ đến n theo thứ tự từ trái sang phải Giả sử có viên bi ô (y, x) - dòng y cột x, bi di chuyển đến ô (y+1, x), (y-1, x), (y, x+1), (y, x-1), ô trống Cho vị trí bắt đầu vị trí kết thúc viên bi, viết chương trình xác định xem có tồn đường để di chuyển viên bi hay không Dữ liệu nhập: gồm dòng sau - Dòng thứ gồm năm số n, sy, sx, dy, dx, số cách khoảng trắng (2 ≤ n ≤ 9; ≤ sy, sx, dy, dx ≤ n) sy số dòng, sx số cột viên bi cần di chuyển dy số dòng, dx số cột vị trí cần di chuyển viên bi đến - Trong n dòng tiếp theo, dòng gồm n số nguyên 1, số cách khoảng trắng, biểu thị tình trạng trò chơi Số nghĩa vị trí ô có bi, số nghĩa vị trí ô trống (Dữ liệu cho bảo đảm ô (sy, sx) có giá trị 1, ô (dy, dx) có giá trị 0) Dữ liệu xuất: - Nếu tìm đường đi, in YES - Nếu không tìm đường đi, in NO Bai7.inp Bai7.out Bai7.inp Bai7.out 21122 YES 21122 NO 10 11 10 10 Bài 8: ốc sên ăn rau Giáo viên: Lê Thanh Phú 6|Tra n g Phuleethanh@gmail.com Tài liệu bồi dưỡng học sinh giỏi THPT – Môn Tin học Phần II: Chuyên đề nâng cao Có khu vườn hình chữ nhật kích thước n x m ô vuông (n dòng, m cột) Ta đánh số dòng từ đến n theo chiều từ xuống dưới, cột từ đến m theo chiều từ trái qua phải Tại ô vuông đất bình thường người ta trồng rau Tuy nhiên có số ô đá nên không trồng rau Có ốc sên ô (y, x), y vị trí dòng, x vị trí cột Từ ô, ốc sên di chuyển sang ô liền kề (y-1, x), (y+1, x), (y, x-1), (y, x+1) Nếu gặp ô đá ốc sên không vào Ốc sên đói Bạn xác định xem ăn số lượng rau nhiều Dữ liệu vào: gồm dòng sau: - Dòng thứ gồm bốn số nguyên n, m, y, x, số khoảng trắng (1 ≤ y ≤ n ≤ 100,1 ≤ x ≤ m ≤ 100) - Trong n dòng tiếp theo, dòng gồm m số nguyên biểu thị vườn rau, số cách khoảng trắng Số nghĩa ô rau, số nghĩa ô đá (Dữ liệu cho đảm bảo ô (y, x) ô rau) Dữ liệu xuất: - Là số nguyên xác định số lượng ô lớn mà ốc sên di chuyển đến Ví dụ: Ocsen.inp Ocsen.out Ocsen.inp Ocsen.out 4524 10 1111 00100 01001 10000 01001 Bài 9: (5 điểm) Tắt đèn Tên file chương trình: TFLI.PAS Trong thành phố có N đường phố xếp hàng ngang N đường phố xếp hàng dọc tạo thành hình bàn cờ hình vẽ bên (ví dụ với N = 5) Tại giao lộ có cột đèn đường Trên đường phố có công tắc bật tắt tất cột đèn thuộc đường phố Như cột đèn bật/tắt hai công tắc, thuộc đường ngang thuộc đường dọc Hiện có số cột đèn sáng Em viết chương trình tìm cách tắt tất cột đèn cho số lần tắt công tắc Dữ liệu vào: Cho file văn TFLI.INP có cấu trúc sau: - Dòng 1: ghi số nguyên dương N (2 ≤ N ≤ 10); - N dòng tiếp theo, dòng ghi N số 1, số biểu thị cột đèn tắt, số biểu thị cột đèn sáng Các số ghi cách dấu cách Kết quả: ghi file văn TFLI.OUT ghi số lần tắt công tắc tìm Ví dụ : TFLI.INP 01010 11010 21111 01010 01010 TFLI.OUT Giải thích Tắt công tắc dòng 3, cột cột Bài 10: Điền số vào ma trận Giáo viên: Lê Thanh Phú 7|Tra n g Phuleethanh@gmail.com Tài liệu bồi dưỡng học sinh giỏi THPT – Môn Tin học Phần II: Chuyên đề nâng cao Hãy lập thuật toán điền phần tử ma trận NxN (2 ≤ N ≤ 200) số -1, 0, cho tổng số hình vuông 2x2 tổng số ma trận lớn Ma trận có phần tử ma trận sở không gọi cấu hình Dữ liệu vào: tập tin MATRAN.INP chứa số N cấp ma trận Kết quả: xuất tập tin MATRAN.OUT gồm: • • Ma trận tìm cấp N Hàng tổng số ma trận tìm Ví dụ: MATRAN.INP 1 2 MATRAN.OUT 1 -1 -1 0 1 -1 -1 0 1 0 -1 Bài 11: Quân tượng lạc: Có quân tượng cờ tướng lạc vào bàn cờ vua Bàn cờ vua có kích thước x 8, dòng đánh số từ đến theo thứ tự từ xuống dưới, cột đánh số từ đến theo thứ tự từ trái qua phải Quân tượng lạc nằm ô (y, x), dòng y cột x Để quay trở lại bàn cờ tướng, quân tượng phải tìm cách di chuyển đến cổng thoát ô (ty, tx) bàn cờ vua Bạn tính xem quân tượng phải di chuyển nước để đến cổng thoát Ghi chú: Quân tượng cờ tướng di chuyển theo đường chéo ô một, từ ô (y, x) đến bốn ô (y-2, x-2), (y-2, x+2), (y+2, x-2), (y+2, x+2) Dữ liệu nhập: - Là bốn số nguyên y, x, ty, tx số cách khoảng trắng (1 ≤ y, x, ty, tx ≤ 8) Dữ liệu xuất: - Nếu quân tượng di chuyển đến cổng thoát, mãi lại bàn cờ vua, in -1 - Nếu quân tượng di chuyển đến cổng thoát, in số bước di chuyển Quto.inp Quto.out Quto.inp Quto.out 1112 -1 3575 Giáo viên: Lê Thanh Phú 8|Tra n g Phuleethanh@gmail.com ... trước, xoá bớt ghi nhớ quay chu trình thử với lựa chọn lại Hành động gọi quay lui (Back tracking) giải thuật thể phương pháp gọi giải thuật quay lui Sử dụng đệ quy quay lui trường hợp nào: Thường... học sinh giỏi THPT – Môn Tin học Phần II: Chuyên đề nâng cao B ĐỆ QUY QUAY LUI (BACK TRACKING) I LÝ THUYẾT Sơ lược đệ quy quay lui Trong lập trình, phương pháp giải toán tổng quát ý Đó việc xác... chất đệ quy Rất thuận tiện để giải toán có chất đệ quy Hiện có nhiều thuật toán chưa có lời giải đệ quy Nhiều giải thuật dễ mô tả dạng đệ quy lại khó mô tả với giải thuật không-đệ -quy Một