Hàm đệ quy trong C là các hàm mà bản thân nó có khả năng gọi lại chính nó. Và kỹ thuật này được gọi là đệ quy. Trong bài học này, Lập Trình Không Khó sẽ cùng các bạn đi tìm hiểu về hàm đệ quy, bao gồm: tính chất của hàm đệ quy, ưu điểm và nhược điểm của đệ quy, thực hành các bài toán kinh điển sử dụng đệ quy, tìm hiểu về khái niệm khử đệ quy…
Chương Kỹ thuật đệ qui 3.1 Khái niệm đệ quy Một hàm gọi đến hàm gọi đệ qui Định nghĩa số tự nhiên số tự nhiên bé Nếu k số tự nhiên k + số tự nhiên Như vậy, số tự nhiên 0, ta có số tự nhiên là: + = 1, + = 2,… Chuỗi ký tự Chuỗi rỗng chuỗi ký tự Một chuỗi ký tự ghép với ký tự chuỗi ký tự 3.1 Khái niệm đệ quy Tính giai thừa, n! Khi n = n! = Khi n > n! = (n - 1)! * n Ước chung lớn hai số nguyên không âm m, n (với m >n) sau: Nếu n = UCLN(m, n) = m Nếu n ≠ UCLN(m, n) = UCLN(n, m mod n) 3.2 Hàm đệ quy Hai bước giải toán đệ quy Bước 1: Phân tích tốn thành tốn đồng dạng đơn giản dừng lại toán đồng dạng đơn giản xác định kết Bước 2: Xác định kết toán đồng dạng từ đơn giản đến phức tạp để có kết cuối 3.2 Hàm đệ quy Cấu trúc hàm đệ quy () { if () { … return ; } Gọi lại hàm với tham số bé } 3.2 Hàm đệ quy Viết hàm tính n!, với n ≥ long Fac(int n) { if(n == 0) return 1; return n*Fac(n – 1); } 3.2 Hàm đệ quy Đệ quy tuyến tính Trong thân hàm có lời gọi hàm gọi lại cách tường minh () { if () { … return ; } … (); … } 3.3 Phân loại đệ qui Đệ quy tuyến tính Tính S(n) = + + … + n S(n) = S(n – 1) + n Điều kiện dừng: S(0) = long Tong(int n) { if (n == 0) return 0; return Tong(n–1) + n; } 3.3 Phân loại đệ qui Đệ quy nhị phân Trong thân hàm có hai lời gọi hàm gọi lại cách tường minh () { if () { … return ; } … (); … … (); … } 3.3 Phân loại đệ qui Đệ quy nhị phân Tính số hạng thứ n dãy Fibonacy f(0) = f(1) = f(n) = f(n – 1) + f(n – 2) n > Điều kiện dừng: f(0) = f(1) = long Fibo(int n) { if (n == || n == 1) return 1; return Fibo(n–1) + Fibo(n–2); } 10 3.3 Phân loại đệ qui Đệ quy hỗ tương Trong thân hàm có lời gọi hàm tới hàm ngược lại () { if () { … return ; } … (); … } } () { if () { … return ; } … (); … } 11 3.3 Phân loại đệ qui Đệ quy hỗ tương Tính số hạng thứ n dãy sau: x(0) = 1, y(0) = x(n) = x(n – 1) + y(n – 1) y(n) = 3*x(n – 1) + 2*y(n – 1) Điều kiện dừng: x(0) = 1, y(0) = long xn(int n) { if (n == 0) return 1; return xn(n-1) + yn(n-1); } long yn(int n) { if (n == 0) return 0; return 3*xn(n-1) + 2*yn(n-1); } 12 3.3 Phân loại đệ qui Đệ quy phi tuyến Trong thân hàm có lời gọi hàm lại đặt bên thân vòng lặp () { if () { … return ; } … Vòng lặp { … (); } … } 13 3.3 Phân loại đệ qui Đệ quy phi tuyến Tính số hạng thứ n dãy: x(0) = x(n) = n2x(0) + (n-1)2x(1) + … + 22x(n – 2) + 12x(n – 1) Điều kiện dừng: x(0) = long xn(int n) { if (n == 0) return 1; long s = 0; for (int i=1; i; } … (); … } 11 3. 3 Phân loại đệ qui Đệ quy hỗ tương Tính số hạng thứ n dãy sau: x(0) = 1, y(0) = x(n) = x(n – 1) + y(n – 1) y(n) = 3* x(n – 1) + 2*y(n – 1) Điều kiện dừng: