Bài giảng cung cấp cho người học các kiến thức: Kỹ thuật lập trình đệ quy. Hi vọng đây sẽ là một tài liệu hữu ích dành cho các bạn sinh viên đang theo học môn dùng làm tài liệu học tập và nghiên cứu.
Trường Đại học Khoa học Tự nhiên Khoa Công nghệ thơng tin Bộ mơn Tin học sở NHẬP MƠN LẬP TRÌNH Đặng Bình Phương dbphuong@fit.hcmus.edu.vn KỸ THUẬT LẬP TRÌNH ĐỆ QUY && VC VC BB BB Nội dung Tổng quan đệ quy Các vấn đề đệ quy thơng dụng Phân tích giải thuật & khử đệ quy Các toán kinh điển Kỹ thuật lập trình đệ quy && VC VC BB BB Bài toán Cho S(n) = + + + … + n =>S(10)? S(11)? S(10) = + + … + 10 = 55 S(11) = + + … + 10 + 11 = 66 = S(10) = 55 + 11 + 11 = 66 Kỹ thuật lập trình đệ quy && VC VC BB BB bước giải toán Bước Thế ngược S(n) Xác định kết toán đồng dạng từ đơn giản đến phức tạp Kết cuối = S(n-1) + n S(n-1) = S(n-2) + n-1 … Bước Phân tích Phân tích thành toán đồng dạng đơn giản Dừng lại tốn đồng dạng đơn giản xác định kết = … S(1) + … = S(0) + S(0) = Kỹ thuật lập trình đệ quy && VC VC BB BB Khái niệm đệ quy Khái niệm Vấn đề đệ quy vấn đề định nghĩa Ví dụ Tổng S(n) tính thơng qua tổng S(n-1) 2 điều kiện quan trọng Tồn bước đệ quy Điều kiện dừng Kỹ thuật lập trình đệ quy && VC VC BB BB Hàm đệ quy NNLT C Khái niệm Một hàm gọi đệ quy bên thân hàm có lời gọi hàm lại cách trực tiếp hay gián tiếp … Hàm(…) { … … Lời gọi Hàm … … … } ĐQ trực tiếp … Hàm1(…) { … … Lời gọi Hàm2 … … … } … Hàm2(…) { … … Lời gọi Hàmx … … … } ĐQ gián tiếp Kỹ thuật lập trình đệ quy && VC VC BB BB Cấu trúc hàm đệ quy { (TS) Phần dừng (Base step) if () • Phần khởi tính tốn { điểm kết thúc thuật tốn … • Khơng chứa phần return ;nghĩa } Phần đệ quy (Recursion step) … • Có sử dụng thuật tốn … Lời gọi Hàm định nghĩa … } Kỹ thuật lập trình đệ quy && VC VC BB BB Phân loại TUYẾN TÍNH NHỊ PHÂN Trong thân hàm có lời gọi hàm gọi lại cách tường minh Trong thân hàm có hai lời gọi hàm gọi lại cách tường minh HỖ TƯƠNG PHI TUYẾN Trong thân hàm có lời gọi hàm tới hàm bên thân hàm có lời gọi hàm tới hàm Trong thân hàm có lời gọi hàm lại đặt bên thân vịng lặp Kỹ thuật lập trình đệ quy && VC VC BB BB Đệ quy tuyến tính Ví dụ Tính S(n) = + + … + n S(n) = S(n – 1) + n ĐK dừng: S(0) = Cấu trúc chương trình TênHàm() { if () { … return ; } … TênHàm(); … } : Chương trình : long Tong(int n) { if (n == 0) return 0; return Tong(n–1) + n; } Kỹ thuật lập trình đệ quy && VC VC BB BB Đệ quy nhị phân Ví dụ Cấu trúc chương trình TênHàm() { if () { … return ; } … TênHàm(); … … TênHàm(); … } Tính số hạng thứ n dãy Fibonacy: f(0) = f(1) = f(n) = f(n – 1) + f(n – 2) n > ĐK dừng: f(0) = f(1) = : Chương trình : long Fibo(int n) { if (n == || n == 1) return 1; return Fibo(n–1)+Fibo(n– 2); } Kỹ thuật lập trình đệ quy && VC VC BB BB Tháp Hà Nội N đĩa A C = N-1 ? đĩa A B + Đĩa N A C + N-1 đĩa B C … N-1 N Cột nguồn A Cột trung gian B Cột đích C Kỹ thuật lập trình đệ quy && VC VC BB BB Tám hậu Mơ tả tốn Cho bàn cờ vua kích thước 8x8 Hãy đặt hồng hậu lên bàn cờ cho khơng có hồng hậu “ăn” nhau: • Khơng nằm dịng, cột • Khơng nằm đường chéo xi, ngược Kỹ thuật lập trình đệ quy && VC VC BB BB Tám hậu – Các dòng n đường Kỹ thuật lập trình đệ quy && VC VC BB BB Tám hậu – Các cột n đường Kỹ thuật lập trình đệ quy && VC VC BB BB Tám hậu – Các đường chéo xuôi 2n-1 đường 14 13 12 11 10 Kỹ thuật lập trình đệ quy && VC VC BB BB Tám hậu – Các đường chéo ngược 2n-1 đường 10 11 12 13 14 Kỹ thuật lập trình đệ quy && VC VC BB BB Tám hậu – Các dòng i=2 j=3 j+i=5 j-i+n-1=8 Kỹ thuật lập trình đệ quy && VC VC BB BB Mã tuần Mơ tả tốn Cho bàn cờ vua kích thước 8x8 (64 ơ) Hãy mã 64 nước cho ô qua lần (xuất phát từ ô bất kỳ) theo luật: Kỹ thuật lập trình đệ quy && VC VC BB BB Phân tích giải thuật đệ quy Sử dụng đệ quy (recursive tree) Giúp hình dung bước phân tích ngược Bước phân tích: từ xuống Bước ngược từ trái sang phải, từ lên Ý nghĩa • Chiều cao Độ lớn STACK • Số nút Số lời gọi hàm Kỹ thuật lập trình đệ quy && VC VC BB BB Nhận xét Ưu điểm Sáng sủa, dễ hiểu, nêu rõ chất vấn đề Tiết kiệm thời gian thực mã nguồn Một số tốn khó giải khơng dùng đệ qui Khuyết điểm Tốn nhiều nhớ, thời gian thực thi lâu Một số tính tốn bị lặp lại nhiều lần Một số tốn khơng có lời giải đệ quy Kỹ thuật lập trình đệ quy && VC VC BB BB Ví dụ đệ quy Fibonacy F(4) F(3) F(2) F(1) F(2) F(1) F(1) F(0) F(0) Lặp lại Kỹ thuật lập trình đệ quy && VC VC BB BB Khử đệ quy (tham khảo) Khái niệm Đưa tốn đệ quy tốn khơng sử dụng đệ quy Thường sử dụng vòng lặp STACK tự tạo … Kỹ thuật lập trình đệ quy && VC VC BB BB Tổng kết Nhận xét Chỉ nên dùng phương pháp đệ quy để giải toán kinh điển giải vấn đề “chia để trị”, “lần ngược” Vấn đề đệ quy không thiết phải giải phương pháp đệ quy, sử dụng phương pháp khác thay (khử đệ quy) Tiện cho người lập trình khơng tối ưu chạy máy Bước đầu nên giải đệ quy bước khử đệ quy để nâng cao hiệu Kỹ thuật lập trình đệ quy && VC VC BB BB Bài tập Bài 1: Các tập mảng sử dụng đệ quy Bài 2: Viết hàm đệ quy xác định chiều dài chuỗi Bài 3: Hiển thị n dòng tam giác Pascal a[i][0] = a[i][i] = a[i][k] = a[i-1][k-1] + a[i-1][k] Dòng 0: Dòng 1: 1 Dòng 2: Dòng 3: 3 Dòng 4: … Kỹ thuật lập trình đệ quy && VC VC BB BB Bài tập Bài 4: Viết hàm đệ quy tính C(n, k) biết C(n, k) = k = k = n C(n, k) = k > n C(n ,k) = C(n-1, k) + C(n-1, k-1) 0