Cộng đồng chia sẻ tri thức Lib24.vn

Chương 2: Đệ Qui và giải thuật đệ qui - Cô Võ Thị Hường

d92392810be327cef135c7bb18b37fe4
Gửi bởi: Võ Thị Hường 10 tháng 9 2020 lúc 9:52:58 | Được cập nhật: 17 giờ trước (10:29:18) Kiểu file: PDF | Lượt xem: 296 | Lượt Download: 2 | File size: 1.336884 Mb

Nội dung tài liệu

Tải xuống
Link tài liệu:
Tải xuống

Các tài liệu liên quan


Có thể bạn quan tâm


Thông tin tài liệu

1. 2. 3. Phép lặp, quy nạp và đệ quy Giải thuật đệ quy Các bài toán liên quan đệ qui   Lặp (interation): biến thể của cùng một thao tác. Quy nạp (induction): kĩ thuật chứng minh các mệnh đề thuộc dạng với mọi n thì P(n) là đúng. Ví dụ: với mọi n, tổng n số lẻ đầu tiên bằng n2 . Bước cơ sở: Chỉ ra P(1) là đúng , vì 12=1. Bước quy nạp: Chứng minh nếu P(n) là đúng thì kéo theo P(n+1) cũng đúng Tổng n số lẻ là n2, cần cm tổng (n+1) số lẻ là (n+1)2. Tổng n số lẻ: 1+3+5+….+ (2n-1)= n2. Khi đó: [1+3+5+….+ (2n-1)] +(2n+1) = n2+2n+1= (n+1)2.  Đệ quy (recursion): là một kĩ thuật định nghĩa một khái niệm trực tiếp hoặc gián tiếp theo chính nó. a) Định nghĩa Nếu lời giải P được thực hiện bằng lời giải P’ có dạng giống như P thì ta nói đó là lời giải đệ quy  thuật toán đệ quy  Chú ý: ◦ P’ giống P ◦ P’ “nhỏ hơn” P theo nghĩa nào đó   Định nghĩa một hàm hay thủ tục đệ quy gồm hai phần: (i) Phần neo (anchor): công việc đơn giản, có thể giải trực tiếp mà không cần nhờ bài toán con (ii) Phần đệ quy: TH bài toán không giải quyết bằng phần neo, ta xác định bài toán con và gọi đệ qui để giải bài toán con đó Phần đệ quy thể hiện tính “quy nạp” của lời giải. Phần neo đảm bảo cho tính dừng của thuật toán.   3.1 Hàm tính giai thừa 3.2 Dãy số Fibonacci 0!=1  1!=1*0!=1  2!=2*1!  3!=3*2!  ……  N!=n*(n-1)! Phần neo là phần định nghĩa kq hàm tại n=0 Phần đệ qui (n>0) là phần tính giai thừa của n dựa vào n và giai thừa n-1  Giải thuật Funtion F(n: integer) Begin if n=0 then F:=1 else F:=n*F(n-1) End;  Phần neo Phần đệ qui  • • • Dựa vào bài toán cổ liên quan đến ss của các cặp thỏ Các cặp thỏ không bao giờ chết Hai tháng sau khi ra đời mỗi cặp thỏ sinh ra 1 cặp thỏ con (1 đực 1 cái) Mỗi tháng sau đó nó lại sinh ra 1 cặp mới Giả sử đầu tháng 1 có 1 cặp thỏ ra đời thì đến giữa tháng n có bao nhiêu cặp thỏ?  N=5 Giữa tháng 1 có 1 cặp (ab) Giữa tháng 2 có 1 cặp (ab) Giữa tháng 3 có 2 cặp (AB)(cd) Giữa tháng 4 có 3 cặp (AB)(cd)(ef) Giữa tháng 5 có 5 cặp( AB)(CD)(ef)(c’d’)(a’b’)  Tính F(n) như sau +F(n)=1 nếu n<=2 +F(n)=F(n-1)+F(n-2) nếu n>2 Viết hàm đệ qui của dãy số Fibonacci? Funtion F(n: integer) Begin if n<=0 then F:=1 else F:=F(n-1)+F(n-2) End;  Cho biết số Fibonacci F 11 = 89 và F 12 = 144 a. Hãy tính F 16 . b. Viết một thủ tục không đệ quy ( dùng phép lặp) để tính và in ra n số Fibonacci đầu tiên.  Bc1: Tính F1=1, F2=1 thì F=1  N>=3 thì F=F(n-1)+F(n-2)  Kết thúc b) Ví dụ: Dãy số Fibonacci: F(n)= F(n-1)+F(n2) (phần đệ quy) ◦ với n<=2 thì F(n)=1 ( phần neo). Recursion - Example • Fibonacci Numbers Pseudo-code C fib( n ) = if ( n = 0 ) then 1 else if ( n = 1 ) then 1 else fib(n-1) + fib(n-2) int fib( n ) { if ( n < 2 ) return 1; else return fib(n-1) + fib(n-2); } Simple, elegant solution!  Bài toán tháp Hà nội : Ngôi đền Benares có 03 cái cọc kim cương, Thượng đế đặt n chiếc đĩa bằng vàng: - Có bán kính khác nhau - Chồng lên nhau ở một chiếc cọc - Theo thứ tự đĩa lớn ở dưới, đĩa nhỏ ở trên. Các nhà sư lần lượt chuyển các đĩa sang một cọc khác theo quy tắc sau:    Khi chuyển một đĩa phải đặt vào một trong 03 cọc Mỗi lần chỉ chuyển đúng một đĩa trên cùng tại một cọc và đặt vào trên cùng ở cọc chuyển đến. Đĩa lớn hơn không được phép đặt lên đĩa nhỏ hơn.     Ví dụ, với trường hợp n=2 ta có thể chuyển như sau: Chuyển đĩa nhỏ sang cọc 3 Chuyển đĩa lớn sang cọc 2 Chuyển đĩa từ cọc 3 sang cọc 2 Nếu n=1 thì chuyển đĩa duy nhất đó từ cọc 1 sang cọc 2. Kết thúc. Giả thiết ta có cách chuyển (n-1) đĩa từ cọc 1 sang cọc 3.  Chuyển đĩa lớn nhất đang ở cọc 1 sang cọc 2  Chuyển (n-1) đĩa từ cọc 3 sang cọc 2.  Kết thúc.  c) Đánh giá về đệ quy Ưu điểm: ◦ Mạnh, rõ ràng, chặt chẽ ◦ Thiết kế TT đơn giản Nhược điểm: ◦ Lời gọi hàm tốn rất nhiều thời gian. ◦ Thận trọng đừng để chạy vô hạn.