Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 26 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
26
Dung lượng
1,59 MB
Nội dung
(cơ bản) Nguyễn Trung Thành [2016-02-27] Mục lục Các vấn đề mở đầu 1a Bài toán lớn toán nhỏ 1b Định nghĩa 2 Định nghĩa đệ quy 2a Định nghĩa 2b Tính chất 2c Các ví dụ minh họa Luyện tập viết code 3a Trình tự phân tích toán theo kiểu đệ quy 3b Những toán đơn giản 10 3c Những toán phức tạp 16 Bài tập 22 Lời kết 24 Các vấn đề mở đầu 1a Bài toán lớn toán nhỏ Bài toán: tính tổng S(n) = + + + … + n (n ∈ N*) Giả sử ta cần tính S(4) S(4) = + + + = (1 + + 3) + = S(3) + Để tính S(4), ta tính S(3) S(3) = + + = (1 + 2) + = S(2) + Để tính S(3), ta tính S(2) S(2) = + = S(1) + Để tính S(2), ta tính S(1) S(1) = Rõ ràng S(1) = toán nhất, ta không cần quy tính toán Kết luận: để tính S(4) => ta tính S(3) => ta tính S(2) => ta tính S(1) = Bài toán tính S(4) quy toán đơn giản tính S(1) = Đệ quy (cơ bản) – Trang 1b Định nghĩa Định nghĩa số tự nhiên: - số tự nhiên - n số tự nhiên n-1 số tự nhiên Giả sử ta cần chứng minh số tự nhiên theo định nghĩa số tự nhiên số tự nhiên số tự nhiên số tự nhiên số tự nhiên số tự nhiên Mà số tự nhiên Suy số tự nhiên (khá giống logic Toán Rời rạc) Các ví dụ cho thấy ý niệm đơn giản đệ quy: toán lớn toán nhỏ hơn, đến gặp “bài toán mini” có lời giải sẵn xem ta giải toán lớn Đệ quy (cơ bản) – Trang Suy nghĩ : BT1 Hãy suy nghĩ, phác họa theo sơ đồ cách tính n! theo cách : + Dùng vòng lặp for + Dùng đệ quy BT2 Hãy suy nghĩ lại toán tính S(n) = + + + … + n theo cách : + Dùng vòng lặp for + Dùng đệ quy + Dùng công thức tường minh học lớp Đệ quy (cơ bản) – Trang Định nghĩa đệ quy 2a Định nghĩa Đệ quy định nghĩa khái niệm dựa nó, hàm gọi đến hàm Ví dụ: S(n) = + + + … + n = S(n-1) + n Cho ví dụ xem S(n) định nghĩa S(n-1) Hàm S tự gọi 2b Tính chất Tính dừng (rất quan trọng) : Đệ quy phải có điểm dừng, điểm dừng tạm thời hiểu toán đơn giản Ví dụ với S(n) = + + + … + n điểm dừng toán đơn giản nhất: S(1) = Tính định nghĩa : Đệ quy mang tính định nghĩa cao, dễ hiểu chất vấn đề Đệ quy (cơ bản) – Trang Ưu điểm đệ quy : + Dễ hiểu chất toán + Đa số code ngắn Khuyết điểm đệ quy : + Khó kiểm soát bước lặp lại đệ quy + Bùng nổ tổ hợp: hiểu nôm na việc toán lớn bị phân thành nhiều toán nhỏ, dẫn đến gọi hàng ngàn, hàng triệu lần hàm đệ quy cuối là…treo máy Vì vậy, giải toán kỹ thuật đệ quy, phải thận trọng, không không kiểm soát nổi, không cách debug nổi, chí treo máy Lưu ý sử dụng đệ quy lập trình hay đề cập đến công thức truy hồi công thức tường minh Ví dụ: tính S(n) = + + + … + n Trong lập trình, ta hay nghĩ đến công thức truy hồi sau : S(1) = S(n) = S(n-1) + n Ta nghĩ đến công thức tường minh ( ) ( ) Đối với toán đơn giản, sử dụng công thức tường minh tốt, nhanh không mang chất đệ quy Khi gặp toán phức tạp, công thức tường minh tìm được, vô dụng :) Đệ quy (cơ bản) – Trang 2c Các ví dụ minh họa Ví dụ : tính S(n) = + + + … + n (n ≥ 1) Công thức truy hồi : S(1) = S(n) = S(n-1) + n Giả sử ta cần tính S(4) S(4) = + S(3) Bước Trả Bước Gọi S(3) S(3) = + S(2) Bước Gọi S(2) Bước Trả S(2) = + S(1) Bước Gọi S(1) Bước Trả Và cuối bước 7: S(4) = + = 10 Đã hiểu Đệ quy (cơ bản) – Trang S(1) = Ví dụ : tính P(n) = * * * … * n (n ≥ 1) Giả sử ta cần tính P(4) P(4) = * P(3) Bước Trả Bước Gọi P(3) P(3) = * P(2) Bước Trả Bước Gọi P(2) P(2) = * P(1) Bước Gọi P(1) Bước Trả Và cuối bước 7: P(4) = * = 24 Đệ quy (cơ bản) – Trang P(1) = Ví dụ : tính R(n) = √ √( Giả sử ta cần tính R(4) = √ Phân tích: Ta có R(2) = √ R(n) = √ R(4) = √ ( √( ) √ √ ) √ √ (n dấu căn) √ √ R(1) = √ ) Kiểm tra lại ta thấy công thức 𝑅( ) Bước Gọi R(3) R(3) = √ 𝑅( ) Bước Gọi R(2) Bước Trả √ R(2) = √ 𝑅( ) Bước Gọi R(1) Bước Trả Và cuối bước 7: R(4) = √ ≈ 2.485 Bắt đầu khó hiểu Đệ quy (cơ bản) – Trang R(1) = 3b Những toán đơn giản Bài toán : toán quen thuộc Tính S(n) = + + + + n Bước Viết S(n) S(n-1) S(n) = + + + … + (n-1) + n S(n-1) = + + + … + (n-1) Bước Biểu diễn S(n) theo S(n-1) S(n) = S(n-1) + n Bước Tìm điểm dừng (bài toán đơn giản nhất) S(1) = Bước Dòng Mã int S (int n) { if (n == 1) return 1; return S(n-1) + n; } Lưu ý quan trọng: dòng code thứ nên if (n Bước Khi mảng a có phần tử a[0], ta dễ dàng kiểm tra a[0] số dương hay không Bước Dòng Mã int ToanSoDuong (int a[], int n) { if (n 0); return ToanSoDuong(a,n-1) && (a[n-1] > 0); } Đệ quy (cơ bản) – Trang 15 3c Những toán phức tạp Bài toán : tính R(n) = √ √( ) √( ) √ √ (n dấu căn) Bước bước Rõ ràng ta thấy viết R(n) R(n-1) khó tìm thấy mối liên hệ chúng Đây toán khó :D Ta thử viết đại R(2) = √ √ R(1) = √ R(n) = √ ( ) Đây ta dự đoán, ta cần kiểm tra lại máy tính bỏ túi Kiểm tra lại ta thấy dự đoán (khỏi cần chứng minh = Toán học :v) Bước R(1) = √ = Bước (nhớ khai báo thư viện math.h nhé) Dòng Mã float R (int n) { if (n a[i+1] Khi tổng số lần hàm TimMax gọi 250 – lần, số lớn…(treo máy) Trong đó, bạn sử dụng code mẫu trên, 50 lần gọi hàm max mà “ Sự chênh lệch vô lớn tạo đẳng cấp khác biệt Đệ quy (cơ bản) – Trang 21 ” Bài tập Tất ví dụ làm trên, thuộc dạng đệ quy tuyến tính Nếu có thời gian, bạn nên luyện tập với toán sau : a) Tính tổng T(n) = 12 + 22 + 32 + … + n2 b) Tính tổng ( ) c) Tìm số Fibonacci thứ n Đây loại đệ quy nhị phân d) Tìm ước chung lớn số (2 cách : trừ liên tiếp chia Euclide) e) Đếm chữ số lẻ số N f) Ta quen thuộc với toán S(n) = + + + … + n Dòng Mã int S (int n) { if (n == 1) return 1; return S(n-1) + n; } Có cách giải khác đệ quy Để tính tổng 1+2+…+10 ta gọi hàm S(1,10) Dòng Mã int S (int i, int n) { if (i [...]... ví dụ sau bạn cũng lưu ý nhé Đệ quy (cơ bản) – Trang 10 Chạy thử nhé Kết quả S(4) = 1 + 2 + 3 + 4 = 10 Chính xác Đệ quy (cơ bản) – Trang 11 Bài toán 2 : Tính P(n) = 2n Bước 1 P(n) = 2*2*2*…*2*2 n số 2 P(n-1) = 2 * 2 * 2 * * 2 n-1 số 2 Bước 2 P(n) = P(n-1) * 2 Bước 3 P(0) = 1 Bước 4 Dòng Mã 1 int P (int n) 2 { 3 if (n