Bài giảng Kỹ thuật lập trình đệ quy gồm có những nội dung chính sau: Giới thiệu về lập trình đệ quy, phân loại các dạng đệ quy, hoạt động của đệ quy, xây dựng giải thuật đệ quy, các giải thuật đệ quy tiêu biểu, các giải pháp thay thế cho đệ quy. Mời các bạn cùng tham khảo.
Trang 2Giới thiệu về lập trình đệ quy
Phân loại các dạng đệ quy
Hoạt động của đệ quy
Xây dựng giải thuật đệ quy
Các giải thuật đệ quy tiêu biểu
Các giải pháp thay thế cho đệ quy
Tóm tắt chương
Nội dung
Trang 3Khi lập trình, gặp dạng bài toán: đối tượng khó địnhnghĩa một cách tường minh Kỹ thuật định nghĩa đốitượng qua chính nó: kỹ thuật đệ quy (recursion).
Ví dụ: 2 chiếc gương đối diện nhau Chiếc thứ nhất
chứa hình chiếc thứ hai và ngược lại Ta hình dung radãy các ảnh vô hạn của hai chiếc gương
Ví dụ: trên truyền hình, biên tập viên ngồi kế bênmàn hình của chương trình đang phát, có dãy hìnhảnh lập đi lập lại nhưng nhỏ dần
[3.1] Giới thiệu về lập trình đệ quy
Trang 4Đệ quy được sử dụng rộng rãi trong khoa học máytính và lý thuyết tính toán.
Định nghĩa theo đệ quy của một khái niệm là địnhnghĩa khái niệm mới thông qua chính khái niệm đangmuốn định nghĩa
Ví dụ: về các định nghĩa đệ quy như sau:
Giai thừa của n (n!):
Nếu n=0 hoặc n=1 thì n!=1
[3.1] Giới thiệu về lập trình đệ quy
Trang 5Ký hiệu số phần tử của một hữu hạn S là |S|:
Nếu S= thì |S| = 0
Nếu S≠ thì chắc chắn có một phần tử xS,khi đó |S|=|S\{x}|+1
Đây là phương pháp định nghĩa tập hợp
Trang 6Cấu trúc danh sách liên kết (linklist/xâu) kiểu T:
Cấu trúc rỗng là danh sách liên kết kiểu T
Kết nối một thành phần kiểu T (nút kiểu T) vàomột danh sách liên kết kiểu T, ta có một danh sáchliên kết kiểu T
[3.1] Giới thiệu về lập trình đệ quy
Trang 7Ví dụ trên, để định nghĩa đệ quy gồm 2 phần:
Phần cố định (cơ sở - neo – anchor): các trườnghợp suy biến (trường hợp đặc biệt) của thuật toánqua một điều kiện cụ thể (phần dừng của đệ quy –
chương trình phải có tính dừng).
Phần đệ quy (quy nạp): mô tả thuật toán trongtrường hợp phổ biến qua chính đối tượng (gọi hàm
đệ quy) một cách gián tiếp hay trực tiếp
Lưu ý: phần đệ quy phải tiến về phần không đệ quy
[3.1] Giới thiệu về lập trình đệ quy
Trang 9S, S*: xử lý không đệ quy Có thể gộp bước 2.1 và 2.2 lại.
Bước 1: Nếu thỏa điều kiện dừng thì
thực hiện thao tác S (trả về kết quả) Bước 2: Ngược lại:
Bước 2.1 thực hiện lệnh S*
Bước 2.2 Gọi hàm đệ quy
(cho đối tượng thường là nhỏ hơn)
Đệ quy tuyến tính
Trang 10Hàm tính giai thừa (n!)
Bước 1: Nếu n=0 hoặc n=1 thì
trả về 1 Bước 2: Ngược lại:
trả về n*Giai_thừa(n-1)
Đệ quy tuyến tính
Trang 12Uớc chung lớn nhất của 2 số dựa vào thuật toánEuclide:
Bước 1: Nếu n=0 thì
trả về m Bước 2: Ngược lại:
Đệ quy tuyến tính
Trang 14Tính tổng giá trị của dãy số nguyên
Trang 16Liệt kê các giá trị lẻ của dãy số nguyên
Bước 1: Nếu n=0 thì
dừng Bước 2: Ngược lại:
Bước 2.1 Nếu a[n-1] lẻ xuất A[n-1] Bước 2.2 gọi hàm lietKeLe(a, n-1)
Đệ quy tuyến tính
Trang 18Kết quả xuất ra ngược với dãy ban đầu nhập vào.
Xuất xuôi lại ta làm như sau:
Bước 1: Nếu n=0 thì
dừng Bước 2: Ngược lại:
Bước 2.1 gọi hàm lietKeLe(a, n-1) Bước 2.2 Nếu a[n-1] lẻ xuất A[n-1]
Đệ quy tuyến tính
Trang 20Đối với hàm đệ quy không có trị trả về (void), ta có thể viết theo dạng sau
Bước 1: Nếu chưa dừng (n>0) thì:
Bước 1.1 gọi hàm lietKeLe(a, n-1) Bước 1.2 Nếu a[n-1] lẻ xuất A[n-1]
Đệ quy tuyến tính
Trang 22Chương trình con gọi trực tiếp đến hàm đệ quy,
thường sẽ có 2 lần gọi hàm đệ quy một cách tường
minh với 2 nhánh rõ ràng
Đệ quy nhị phân
Trang 23Bước 1: Nếu thỏa điều kiện dừng thì
thực hiện thao tác S (trả về kết quả) Bước 2: Ngược lại:
Trang 24Viết hàm fiBoNaCi(n) để tính số hạng thứ n của dạyFibonaci.
Bước 1: Nếu n<2 thì
trả về 1 Bước 2: Ngược lại:
trả về fiBo(n-1)+fiBo(n-2)
Đệ quy nhị phân
Trang 26Tìm kiếm nhị phân trên dãy đã được sắp tăng.
Bước 1: Nếu left>right trả về -1
Trang 27Cài đặt:
int timNhiPhan(int []a,int left, int right,int X)
{ if (left > right) return -1;
int mid = (left + right) / 2;
if (a[mid] == X) return mid;
if (a[mid] < X) return timNhiPhan(a, mid +1,right,X);
return timNhiPhan(a,left,mid-1,X);
}
Đệ quy nhị phân
Trang 28Đệ quy trực tiếp, gọi đệ quy trong vòng lặp.
Vòng lặp for từ giá trị đầu đến giá trị cuối
Trang 29Hoặc có dạng:
B1: Nếu thỏa điều kiện dừng thì
Thực hiện lệnh S B2: Ngược lại:
Trang 30Ta có công thức truy hồi tính dãy {Xn} như sau:
X0 = 1
Xn = n2X0 +(n-1)2X1+ +22Xn-2 = 12Xn-1
Đệ quy phi tuyến
Trang 31int tinhX(int n)
{ if (n == 0) return 1;
else { int tong = 0;
for (int i = 0; i < n; i++)tong += (n - i) * (n - i) * tinhX(i);
return tong;
}}
Đệ quy phi tuyến
Trang 32Trong thân hàm này có lời gọi hàm đến hàm kia vàtrong thân hàm kia có lời gọi hàm tới hàm này.
Trang 33Hàm thứ hai B1: Nếu thỏa đk dừng thì
Thực hiện lệnh S*
Thực hiện lệnh S Gọi ĐQ hàm nhất
Đệ quy hỗ tương
Trang 34Tính số hạng thứ n của hai dãy {Xn}, {Yn} được địnhnghĩa như sau:
Trang 36Gồm 2 pha:
Pha tiến (forward): Tiến đến lời giải nhỏ nhất
Pha lùi (backward): Kết hợp các kết quả lại vớinhau
[3.3] Hoạt động của đệ quy
Trang 37Main( ) Gọi Giai thừa 5
Giai Thừa ( 5 ) Gọi Giai thừa 4
Giai Thừa ( 4 ) Gọi Giai thừa 3
Giai Thừa ( 3 ) Gọi Giai thừa 2
Giai Thừa ( 2 ) Gọi Giai thừa 1
Trang 38F0=1 F1=1
F1=1 F2=F1+F0
F2=F1+F0 F3=F2+F1
Trang 39F0=1 F1=1
F0=1 F1=1
F1=1 F2=F1+F0
F2=F1+F0 F3=F2+F1
kq=1 kq=1
kq=1 kq=2 kq=1 kq=1
kq=2 kq=3
kq=5
Trang 40Bước 1: Thông số hóa bài toán.
Bước 2: Phát hiện các trường hợp suy biến (đặc biệt,
dừng, neo) và tìm giải thuật cho bài toán này
Bước 3: Phân rã bài toán theo hướng đệ quy.
[3.4] Xây dựng giải thuật đệ quy
Trang 41Tổng quát hóa bài toán, tìm ra nhóm các bài toán, cácthông số kích thước, thông số điều khiển.
Ví dụ: thông số n trong hàm tính giai thừa, trong hàmFibonaci, thông số a,b trong hàm tìm ước số chunglớn nhất
Bước 1: Thông số hóa bài toán
Trang 42Là các trường hợp tương ứng với giá trị biên của biếnđiều khiển (trường hợp kích thước nhỏ nhất, trườnghợp đặc biệt) mà giải thuật không đệ quy giải rất đơgiản.
Trang 43Tìm giải thuật trong trường hợp tổng quát bằng cáchphân rã thành các thành phần nhỏ hơn không đệ quyhoặc là bài toán đệ quy nhưng với kích thước nhỏhơn.
Bước 3: Phân rã theo hướng đệ quy
Trang 44B1: Thông hóa hóa bài toán:
Xét ở mức tổng quát: chuyển n (n>0) đĩa từ cột Asang cột C với cột B làm trung gian
Ta gọi hàm có tên thapHaNoi(n,A,B,C) với bốn
tham số, trong đó thông số n là thông số thay đổi,
ta gọi n là thông số điều khiển
Bài toán tháp hà nội
Trang 45B2: Trường hợp suy biến và giải thuật:
Với n=1 bài toán tổng quát suy biến thành bài toánđơn giản thapHaNoi(1,A,B,C), lúc này chỉ cầnchuyển 1 đĩa từ cột A sang cột C là xong (trong đó
B là cột trung gian), ta có thao tácchuyenDia(A,C)
Bài toán tháp hà nội
Trang 46B3: Phân rã bài toán:
Muốn n đĩa từ cột A sang cột C, với cột B là cột trunggian thapHaNoi, ta thực hiện 3 công việc sau:
Chuyển (n-1) đĩa từ cột A sang cột B, lấy C làmtrung gian: thapHaNoi(n-1,A,C,B)
Chuyển 1 đĩa từ cột A sang cột C: chuyenDia(A,C)thao tác không đệ quy
Chuyển (n-1) đĩa từ cột B sang cột C, lấy A làm
Bài toán tháp hà nội
Trang 47Ta có giải thuật sau: thapHaNoi(n,A,B,C).
Bước 1: Nếu chưa dừng (n>1) thì
Bước 1.1 thapHaNoi(n-1,A,C,B) Bước 1.2 chuyenDia(A,C)
Bước 1.3 thapHaNoi(n-1,B,A,C)
Bài toán tháp hà nội
Trang 48void chuyenDia(char A, char C)
}
int main()
Trang 51tính số hạng thứ n của dãy fibonaci.
Trang 52Một hàm được gọi có tính đệ qui nếu trong thân củahàm đó có lệnh gọi lại chính nó một cách tường minhhay tiềm ẩn.
Phân loại đệ qui
Đệ qui tuyến tính
Đệ qui nhị phân
Đệ qui phi tuyến
Đệ qui hỗ tương
Tóm tắt chương
Trang 53Hoạt động đệ quy gồm 2 pha: pha tiến và pha lùi.
Ta có ba bước để xây dựng giải thuật đệ quy:
Trang 54Có một số giải thuật đệ quy tiêu biểu như: quay lui,nhánh cận và chia để trị.
Ta có thể dùng các giải pháp thay thế cho đệ quy như:
Dùng công thức tường minh, vòng lặp.
Dùng mảng 1 chiều, 2 chiều
Dùng Stack
Tóm tắt chương
Trang 55Tính n!
In ra các ước số của số nguyên dương
Đếm số lượng ước số của số nguyên dương
Tìm ước số chung lớn nhất của 2 số nguyên dương
Kiểm tra số nguyên dương n có phải là số nguyên tố?
Nhập vào mảng 1 chiều số nguyên a, kích thước n
Xuất mảng 1 chiều số nguyên a, kích thước n
Bài tập
Trang 56Tìm phần tử có giá trị x trong mảng số nguyên a, kíchthước n
Viết hàm đệ quy tính tổ hợp chập k của n
Viết hàm đệ quy In mảng a gồm n phần tử (n≤100)lên màn hình
Viết hàm đệ quy In ra các chữ số của số nguyên ntheo thứ tự đảo ngược
Viết hàm đệ quy Tìm số lớn nhất /nhỏ nhất của mảng
Bài tập
Trang 57Viết hàm đệ quy Đếm số lần xuất hiện của ký tự ch trongchuỗi s
Viết hàm đệ quy Kiểm tra n có phải là số nguyên tố không
Viết hàm đệ quy Giải bài toán tháp Hanoi
Viết hàm đệ quy liệt kê các phân số tối giản không giảmnằm trong [0, 1] và có mẫu số nhỏ hơn hay bằng n
Viết hàm đệ quy Tính giá trị của một số viết dưới dạng chữ
LA MÃ
Viết hàm đệ quy cho bài toán mã đi tuần
Bài tập