Chủ đề : ‘‘Thế đệquy Cho ví dụ minh họa C/C++’’ Khái niệm: “Có trường hợp gặp tốn lớn thường khơng giải đc, giải đơn giản hiệu ta nhìn góc độ mang tính đệ qui, cách giải tốn tương tự với kích thước nhỏ hơn,sau ghép lại đc tốn lớn” * Một đối tượng gọi đệquy mơ tả thơng qua định nghĩa Nghĩa là, đối tượng định nghĩa cách quy nạp từ khái niệm đơn giản dạng với Ví dụ: – Số tự nhiên định nghĩa sau : • • số tự nhiên Nếu k số tự nhiên k+1 số tự nhiên Theo đó, ta có : 1=0+1 số tự nhiên, 2=1+1 số tự nhiên,….Cứ ta định nghĩa số tự nhiên khác lớn Do đó, số tự nhiên khái niệm mang chất đệquy – Định nghĩa giai thừa n (n!) : • • Khi n=0, ta có 0!=1 Khi n>0, ta có n!=(n-1)! x n Như vậy, ta suy : 1! = 0! x 1, 2! = 1! x 2,… –> giai thừa khái niệm mang tính đệquy * Trong lập trình C/C++, đệquy khái niệm hàm gọi đệquy bên thân có lời gọi đến - Khi gọi, hàm đệquy thường truyền cho tham số, thường kích thước toán lớn ban đầu Sau lời gọi đệ quy, tham số nhỏ dần, nhằm phản ánh toán nhỏ đơn giản Khi tham số đạt tới giá trị cực tiểu (tại điểm neo), hàm chấm dứt - Trong lập trình, tốn muốn giải đệquy thân phải tốn đệquy Tức tốn đưa tốn dạng đơn giản 2 Cách thức làm việc thủ tục Đệquy - Phương thức đệquy gọi lại nó trả điều kiện dừng - Mỗi lần gọi đưa vào Stack hệ thống.(sử dụng không gian nhớ stack để lưu giá trị trung gian) - Khi đạt điều kiện dừng, lấy từ Stack.(Nguyên tắc làm việc Stack- Vào sau trước (LIFO-Last In First Out) Trong trường hợp điểm dừng, gọi mà chưa tới điểm dừng, dễ xảy tình trạng tràn nhớ Stack Vì Hàm đệquy khơng thể gọi tới mãi, cần phải có điểm dừng trường hợp đặc biệt, gọi trường hợp suy biến Cấu trúc Một hàm, thủ tục đệquy thường gồm phần: - Phần sở: trình bày cách thực cụ thể, mà toán đưa dạng đơn giản, hình dung đầy đủ lời giải nó.(Định nghĩa với trường hợp đơn giản khơng gọi lại nó) - Phần đệ quy: xác định toán xây dựng lời giải toán từ lời giải toán con.(Định nghĩa trường hợp lại gọi lại khái niệm định nghĩa) Ví dụ minh họa a Bài tốn tính giai thừa Cho n số tự nhiên (n>=0) Hãy tính giai thừa n (n!) biết 0!=1 n!=(n-1)! * n Phân tích : – Theo giả thiết, ta có : n! = (n-1)! * n Như : • Để tính n! ta cần phải tính (n-1)! • Để tính (n-1)! ta phải tính (n-2)! … • – Cứ vậy, gặp trường hợp 0! Khi ta có kết 1, khơng cần phải tính thơng qua kết trung gian khác Cài đặt C++: b Dãy Fibonaci Dãy Fibonaci dãy vô hạn số tự nhiên Số Fibonaci thứ n, ký hiệu F(n), định nghĩa sau: • • F(n) = 1, n=0 n=1; F(n) = F(n-1) + F(n-2), n>=2; Yêu cầu : Tính số fibonaci thứ n với n cho trước Phân tích : theo giả thiết – Với n=2 : • • • • Đế tính F(n) ta phải tính F(n-1) F(n-2); Để tính F(n-1) ta lại phải tính F(n-2) F(n-3), để tính F(n-2) ta phải tính F(n-3) F(n-4) … Cứ n=0 n=1 Cài đặt C++ : c Bài toán “Tháp Hà Nội” (Tower of Ha Noi) Đây toán tiếng kinh điển, thích hợp để minh họa cho thuật toán đệquy Sau nội dung tốn : Có cọc đánh dấu A, B, C n đĩa Các đĩa có kích thước khác đĩa có lỗ để cắm vào cọc Ban đầu, đĩa nằm cọc A, đó, đĩa nhỏ ln nằm đĩa lớn Yêu cầu : chuyển n đĩa từ cọc A sang cọc đích C với điều kiện sau : + Mỗi lần chuyển đĩa + Trong q trình chuyển, đĩa nhỏ phải ln nằm đĩa lớn + Cho phép sử dụng cọc B làm cọc trung gian Phân tích : ta xét trường hợp n – Trường hợp đơn giản nhất, n=1, ta cần chuyển đĩa từ cọc A sang cọc C – Nhiều chút, n=2, ta chuyển đĩa nhỏ sang cọc B, chuyển đĩa lại sang cọc C, cuối chuyển đĩa nhỏ cọc B sang cọc C – Bây ta xét n đĩa (n>2) Giả sử ta có cách chuyển n-1 đĩa từ cọc sang cọc khác Như vậy, để chuyển n đĩa từ cọc nguồn sang cọc đích, ta cần chuyển n-1 đĩa từ cọc nguồn sang cọc trung gian Sau chuyển đĩa lớn từ cọc nguồn sang cọc đích Cuối cùng, chuyển n-1 từ cọc trung gian cọc đích Cài đặt C++ : Kết luận Giải thuậtđệquy có ưu điểm thuận lợi cho việc biểu diễn tốn, đồng thời làm gọn chương trình Tuy nhiên có nhược điểm, khơng tối ưu mặt thời gian (so với sử dụng vòng lặp), việc giải nhiều lần toán giống thuật tốn trở nên chậm chạp, gây tốn nhớ (không đủ không gian stack để lưu giá trị trung gian) ...2 Cách thức làm việc thủ tục Đệ quy - Phương thức đệ quy gọi lại nó trả điều kiện dừng - Mỗi lần gọi đưa vào Stack hệ thống.(sử dụng không... tình trạng tràn nhớ Stack Vì Hàm đệ quy khơng thể gọi tới mãi, cần phải có điểm dừng trường hợp đặc biệt, gọi trường hợp suy biến Cấu trúc Một hàm, thủ tục đệ quy thường gồm phần: - Phần sở: trình... giản, hình dung đầy đủ lời giải nó.(Định nghĩa với trường hợp đơn giản khơng gọi lại nó) - Phần đệ quy: xác định toán xây dựng lời giải toán từ lời giải tốn con.(Định nghĩa trường hợp lại gọi lại