CHUYÊN đề KỸ THUẬT đệ QUY PHƯƠNG PHÁP QUAY LUI

24 28 0
CHUYÊN đề KỸ THUẬT đệ QUY PHƯƠNG PHÁP QUAY LUI

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

SỞ GD-ĐT KHÁNH HÒA =================== TÀI LIỆU TẬP HUẤN CHUYÊN MÔN THCS MÔN: TIN HỌC CHUYÊN ĐỀ KỸ THUẬT ĐỆ QUY PHƯƠNG PHÁP QUAY LUI ThS Dương Khắc Hưởng Trường THPT chuyên Lê Quý Đôn Nha Trang, tháng 8/2018 Tài liệu tập huấn chuyên môn – Tin học THCS MỤC LỤC CHUYÊN ĐỀ 1: KỸ THUẬT ĐỆ QUY Đệ quy gì? 2 Bài toán đệ quy 3 Lập trình đệ quy .3 Một số ví dụ cài đặt chương trình đệ quy CHUYÊN ĐỀ 2: PHƯƠNG PHÁP QUAY LUI .8 Thế phương pháp quay lui? .8 Bài toán quay lui vét cạn tổng quát Ý tưởng phương pháp quay lui Một số toán ứng dụng phương pháp quay lui .9 BÀI TẬP .17 Bài 40 17 Bài 41: .17 Bài 42: .18 Bài 43: .18 Bài 44: .19 Bài 45: .19 Bài 46: .20 Bài 47: .20 Bài 48: .21 Bài 49: .21 TÀI LIỆU THAM KHẢO .23 ThS Dương Khắc Hưởng – GV trường THPT chun Lê Q Đơn – Khánh Hịa Tài liệu tập huấn chuyên môn – Tin học THCS CHUYÊN ĐỀ 1: KỸ THUẬT ĐỆ QUY Đệ quy gì? Trong thực tế, đối tượng gọi đệ quy (recursion) mơ tả lại thơng qua Nghĩa là, đối tượng định nghĩa cách quy nạp từ khái niệm đơn giản dạng với Ví dụ để định nghĩa tổ tiên người, người ta định nghĩa sau: * Bố mẹ người tổ tiên người (trường hợp bản) * Bố mẹ tổ tiên người tổ tiên người (trường hợp đệ quy) Trong đời sống, ta thường xuyên thấy số tượng đệ quy, ví dụ hai gương đặt đối diện nhau, vòng xoắn ốc (trong vịng xoắn ốc có vịng xoắn ốc nhỏ hơn) Trong tốn học khoa học máy tính, tính chất (hoặc cấu trúc) gọi đệ quy lớp đối tượng phương pháp xác định việc xác định số trường hợp phương pháp đơn giản (thông thường một) sau xác định quy tắc đưa trường hợp phức tạp trường hợp đơn giản Ví dụ tốn học, số toán định nghĩa dạng đệ quy (quy nạp) sau: Định nghĩa số tự nhiên : số tự nhiên Nếu k số tự nhiên k+1 số tự nhiên Theo đó, ta có: = + số tự nhiên, = + số tự nhiên, ….Cứ ta định nghĩa số tự nhiên khác lớn Do đó, số tự nhiên khái niệm mang chất đệ quy Định nghĩa giai thừa n (n!) : Khi n=0, ta có 0!=1 Khi n>0, ta có n! = (n - 1)! × n Như vậy, ta suy : 1! = 0! × 1, 2! = 1! × 2,… Giai thừa khái niệm mang tính đệ quy ThS Dương Khắc Hưởng – GV trường THPT chun Lê Q Đơn – Khánh Hịa Tài liệu tập huấn chuyên môn – Tin học THCS Bài toán đệ quy Bài toán đệ quy toán mang chất đệ quy Nghĩa tốn phân rã thành tốn nhỏ hơn, đơn giản có dạng với toán ban đầu Những toán nhỏ lại tiếp tục phân rã thành toán nhỏ Cứ toán đơn giản đến mức suy kết mà khơng cần phải phân rã (bài tốn nhẩm tính kết quả) Để giải tốn mang tính chất đệ quy ta phải giải tất toán kết hợp kết tốn 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 Lập trình đệ quy Trong lập trình xây dựng chương trình đệ quy cách đặt lời gọi đến thân Thơng thường với chương trình đệ quy gọi ta phải truyền vào cho tham số tham số chương trình bị gọi phải nhỏ tham số chương trình gọi Việc làm dẫn đến chương trình xử lý liên tục tham số truyền vào gặp điểm dừng (điểm neo) vị trí đặc biệt gọi trường hợp suy biến (degenerate) chưa đến điểm neo mà nhớ bị vét cạn (tràn) chương trình báo lỗi dừng lại Ví dụ ngơn ngữ lập trình Pascal báo lỗi “stack over flow” Trong lập trình, chương trình gọi đưa vào vùng nhớ nhớ Stack, chương trình đệ quy vậy, lần có lệnh gọi, chương trình đệ quy đưa vào Stack khơng có điểm dừng, gọi mà chưa tới điểm dừng chương trình gây lỗi tràn nhớ Như vậy, việc xây dựng môt chương trình đệ quy để giải ta phải có điều kiện sau: + Bài tốn phải định nghĩa dạng đệ quy; + Trong định nghĩa phải có trường hợp suy biến; + Sau lần gọi đệ quy tham số chương trình phải nhỏ dần gặp trường hợp suy biến ThS Dương Khắc Hưởng – GV trường THPT chuyên Lê Q Đơn – Khánh Hịa Tài liệu tập huấn chuyên môn – Tin học THCS Lược đồ chung chương trình đệ quy có dạng sau: Procedure/Function (); Begin If (trường hợp suy biến) then Else Begin [lệnh tiền đệ quy]; ; [lệnh hậu đệ quy]; End; End; Một số ví dụ cài đặt chương trình đệ quy Ví dụ 1: Bài tốn tính giai thừa số nguyên n Định nghĩa toán GT(n) = n=0; GT(n) = n * GT(n-1) n>0 Cài đặt Function GT(n:longint):longint; Begin If n=0 then exit(1) Else exit(n*GT(n-1)) End; Ví dụ 2: Bài tốn tìm số thứ n dãy Fibonaci Định nghĩa toán F(n) = n=1 n=2 F(n) = F(n-1)+F(n-2) n>2 Cài đặt Function F(n:longint):longint; Begin ThS Dương Khắc Hưởng – GV trường THPT chun Lê Q Đơn – Khánh Hịa Tài liệu tập huấn chuyên môn – Tin học THCS If (n=1) or (n=2) then exit(1) Else exit(F(n-1)+F(n-2)) End; Ví dụ 3: Tìm xâu đảo ngược xâu S có độ dài n Định nghĩa toán nguoc(S) = S n=1 nguoc(S) = S[n]+nguoc(copy(S,1,n-1)); Cài đặt Function Nguoc(s:string):longint; Var n:integer; Begin n:=length(s); If n=1 then exit(S) Else exit(S[n]+Nguoc(copy(S,1,n-1))) End; Có thể cài đặt thủ tục sau procedure Nguoc(s:string); begin if length(s)=1 then write(s) else begin write(S[length(s)]); Nguoc(copy(S,1,length(s)-1)); end; end; Ví dụ 4: Tìm ước chung lớn hai số nguyên dương a b Định nghĩa toán UCLN(a,b) = a a = b UCLN(a,b) = UCLN(max(a,b)-min(a,b),min(a,b)) ThS Dương Khắc Hưởng – GV trường THPT chun Lê Q Đơn – Khánh Hịa Tài liệu tập huấn chuyên môn – Tin học THCS Cài đặt Function ucln(a,b:longint):longint; Begin If a=b then exit(a) Else exit(UCLN(max(a,b)-min(a,b),min(a,b))) End; Ví dụ 5: Bài tốn tìm số lớn mảng A có n phần tử Định nghĩa toán Amax(A,n) = A[1] n=1; Amax(A,n) = max(Amax(A,n-1,A[n]); Cài đặt uses math; const maxn=1000; type arr = array[1 maxn] of longint; var A:arr; n,i:longint; function Amax(A:Arr;n:longint):longint; begin if n=1 then exit(A[1]) else exit(max(A[n],Amax(A,n-1))); end; begin write('n = '); readln(n); for i:=1 to n begin write('A[',i,']= '); readln(A[i]); end; write('Max = ',Amax(A,n)); readln; End ThS Dương Khắc Hưởng – GV trường THPT chun Lê Q Đơn – Khánh Hịa Tài liệu tập huấn chuyên môn – Tin học THCS Ví dụ 6: Tính tổng chữ số số nguyên dương Định nghĩa toán Tongcs(n) = n n9 Cài đặt Function tongcs(n:longint):longint; Begin If nvmax) and (v0) and (pos('B',X)>0) and (pos('C',X)>0) then writeln(f,X); end; procedure try(i:longint); var j:char; begin for j:='A' to 'C' begin if jX[i-1] then begin X[i]:=j; if i=n then ghinghiem else try(i+1); end; end; end; procedure Nhap; var f:text; i:longint; begin ThS Dương Khắc Hưởng – GV trường THPT chuyên Lê Q Đơn – Khánh Hịa 12 Tài liệu tập huấn chuyên môn – Tin học THCS assign(f,fi); reset(f); readln(f,n); close(f); end; Begin Nhap; X:=''; for i:=1 to n X:=X+'A'; assign(f,fo); rewrite(f); Try(1); close(f); end Bài 3: Bài toán quân hậu Cần đặt quân hậu bàn cờ vua x cho chúng không công nhau, tức khơng có hai qn hậu nằm hàng, cột đường chéo Ví dụ: Hình bên cách đặt hậu thỏa mãn u cầu tốn, tơ màu vị trí đặt hậu Phân tích tốn Mỗi qn hậu đặt hàng nên cần tìm cột chưa đặt để đặt quân hậu Quân hậu thứ i (i=1 8) đặt cột x i vector nghiệm toán X = {x1, x2, …, x8} Giá trị xi chọn tập {1, 2, 3, 4, 5, 6, 7, 8} nên tập ứng cử viên cho vetor nghiệm S = {1, 2, 3, 4, 5, 6, 7, 8} Điều kiện vector nghiệm là: + Khơng có hai qn hậu cột, nghĩa với i ≠ j xi ≠ xj + Dễ dàng nhận thấy hai ô (x1, y1) (x2, y2) nằm đường chéo (từ phải xuống trái) x1-y1 = x2-y2 Và hai ô (x1, y1) (x2, y2) nằm đường chéo phụ (từ trái xuống phải) x 1+y1 = x2+y2 điều kiện để quân hậu thứ i thứ j (i ≠ j) không đặt đường chéo là: i-x i ≠ j-xj i+xi ≠ j+xj ThS Dương Khắc Hưởng – GV trường THPT chuyên Lê Quý Đôn – Khánh Hịa 13 Tài liệu tập huấn chun mơn – Tin học THCS Từ phân tích trên, xây dựng cấu trúc liệu cho chương trình sau: + Mảng X[1 8] dùng để lưu trữ vector nghiệm + Mảng C[1 8] dùng để đánh dấu cột đặt quân hậu hay chưa + Mảng CC[-7 7] dùng để đánh dấu đường chéo đặt quân hậu hay chưa + Mảng CP[2 16] dùng để đánh dấu đường chéo phụ đặt quân hậu hay chưa Cài đặt chương trình const maxn = 20; fi = 'bai3.inp'; fo = 'bai3.out'; var B:array[1 maxn,1 maxn] of char; CC:array[-maxn maxn] of boolean; CP:array[2 maxn *2] of boolean; C:array[1 maxn] of boolean; X:array[1 maxn] of integer; n,dem:integer; f:text; procedure Input; var f:text; begin assign(f,fi); reset(f); readln(f,n); close(f); end; procedure ghinghiem; var i,j:integer; begin inc(dem); ThS Dương Khắc Hưởng – GV trường THPT chuyên Lê Q Đơn – Khánh Hịa 14 Tài liệu tập huấn chuyên môn – Tin học THCS Writeln(f,'Cach thu: ',dem); for i:=1 to n write(f,X[i]:5); writeln(f); end; procedure tryby(i:integer); var j:integer; begin for j:=1 to n begin if not(C[j]) and not(CC[i-j]) and not(CP[i+j]) then begin X[i]:=j; C[j]:=true; CC[i-j]:=true; CP[i+j]:=true; if i=n then ghinghiem else tryby(i+1); C[j]:=false; CC[i-j]:=false; CP[i+j]:=false; end; end; end; BEGIN Input; fillchar(C,sizeof(C),false); fillchar(CP,sizeof(CP),false); fillchar(CC,sizeof(CC),false); dem:=0; assign(f,fo); rewrite(f); ThS Dương Khắc Hưởng – GV trường THPT chuyên Lê Q Đơn – Khánh Hịa 15 Tài liệu tập huấn chuyên môn – Tin học THCS tryby(1); close(f); END ThS Dương Khắc Hưởng – GV trường THPT chuyên Lê Q Đơn – Khánh Hịa 16 Tài liệu tập huấn chuyên môn – Tin học THCS BÀI TẬP Bài 40 Số siêu nguyên tố số nguyên tố mà bỏ số tùy ý chữ số bên phải cùa phần cịn lại số ngun tố Ví dụ số 2333 số siêu nguyên tố có chữ số số 233, 23, số nguyên tố Cho số n (1

Ngày đăng: 09/10/2021, 22:04

Mục lục

  • CHUYÊN ĐỀ 1: KỸ THUẬT ĐỆ QUY

    • 1. Đệ quy là gì?

    • 2. Bài toán đệ quy

    • 3. Lập trình đệ quy

    • 4. Một số ví dụ về cài đặt chương trình đệ quy

    • CHUYÊN ĐỀ 2: PHƯƠNG PHÁP QUAY LUI

      • 1. Thế nào phương pháp quay lui?

      • 2. Bài toán quay lui vét cạn tổng quát

      • 3. Ý tưởng phương pháp quay lui

      • 4. Một số bài toán ứng dụng phương pháp quay lui

      • TÀI LIỆU THAM KHẢO

Tài liệu cùng người dùng

Tài liệu liên quan