Chương 3 Kỹ thuật đệ qui 3.1. Khái niệm đệ quy Một hàm gọi đến chính hàm đó thì được gọi là đệ qui Định nghĩa số tự nhiên 0 là số tự nhiên bé nhất. Nếu k là số tự nhiên thì k + 1 cũng là số tự nhiên Như vậy, số tự nhiên bắt đầu từ 0, ta có các số tự nhiên là: 0 + 1 = 1, 1 + 1 = 2,… Chuỗi ký tự Chuỗi rỗng là một chuỗi ký tự. Một chuỗi ký tự ghép với một ký tự bất kỳ là một chuỗi ký tự. Tính giai thừa, n Khi n = 0 thì n = 1 Khi n > 0 thì n = (n 1) n Ước chung lớn nhất của hai số nguyên không âm m, n (với m >n) như sau: Nếu n = 0 thì UCLN(m, n) = m Nếu n ≠ 0 thì UCLN(m, n) = UCLN(n, m mod n)
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