1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Bài giảng kỹ thuật lập trình – chương 6 kỹ thuật đệ quy

50 9 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 50
Dung lượng 717,48 KB

Nội dung

om c ng co cu u du on g th a n Kỹ thuật đệ quy CuuDuongThanCong.com https://fb.com/tailieudientucntt om c ng co cu u Recursive du on g th a n Nhắc lại kỹ thuật Đệ quy CuuDuongThanCong.com https://fb.com/tailieudientucntt n cu u du on g th a Mô tả theo cách phân tích đối tượng thành nhiều thành phần mà số thành phần có thành phần mang tính chất đối tượng mơ tả co ng c om Mô tả đệ quy Recursive Mô tả đối tượng thơng qua CuuDuongThanCong.com https://fb.com/tailieudientucntt om Mơ tả đệ quy tập số tự nhiên N  Số số tự nhiên (1-N)  Số tự nhiên số tự nhiên cộng du on g th a n co ng c Mô tả đệ quy cấu trúc danh sách kiểu T  Cấu trúc rỗng danh sách kiểu T  Ghép nối thành phần kiểu T (nút kiểu T) với danh sách kiểu T ta có danh sách kiểu T u Mơ tả đệ quy gia phả  Gia phả người bao gồm người gia phả cha gia phả mẹ cu Ví dụ CuuDuongThanCong.com https://fb.com/tailieudientucntt Tính giai thừa n Định nghĩa khơng đệ quy n! n! = n * (n-1) * … * Định nghĩa đệ quy: n! = n=0 n * (n-1)! n>0 c om  u du on g Mã C++ th a n co ng  cu Ví dụ CuuDuongThanCong.com int factorial(int n) { if (n==0) return 1; else return (n * factorial(n - 1)); } https://fb.com/tailieudientucntt .c om Thực tính giai thừa co ng factorial (3) n=3 factorial (2) n=2 3*factorial(2) th a n … du on g … factorial (1) n=1 2*factorial(1) … cu u factorial (0) n=0 1*factorial(0) 1 CuuDuongThanCong.com https://fb.com/tailieudientucntt … return 1; .c om Trạng thái hệ thống tính giai thừa n factorial(0) co ng Stack hệ thống th a factorial(1) factorial(1) factorial(1) du on g factorial(2) factorial(2) factorial(2) factorial(2) factorial(2) factorial(3) factorial(3) factorial(3) factorial(3) factorial(3) factorial(3) factorial(3) u cu Thời gian hệ thống t Gọi hàm Gọi hàm factorial(3) factorial(2) Trả từ Gọi hàm Gọi hàm hàm factorial(1) factorial(0) factorial(0 ) Trả từ hàm factorial(1 ) Trả từ hàm factorial(2 ) Trả từ hàm factorial(3 ) t CuuDuongThanCong.com https://fb.com/tailieudientucntt .c om Thành phần mô tả đệ quy ng ▪ Phần neo: trường hợp suy biến đối tượng n co ▫ Ví dụ: số tự nhiên, cấu trúc rỗng danh sách kiểu T, 0!=1, SM (a[x:x]) thao tác rỗng du on g th a ▪ Phần qui nạp: mô tả đối tượng (giải thuật) thông qua đối tượng (giải thuật) cách trực tiếp gián tiếp cu u Ví dụ: ▫ n! = n * (n –1)! ▫ SM (a[m:n]) ≡Merge (SM (a[m:( m+n) div 2] , SM (a[(m+n) div +1 : n]) ) CuuDuongThanCong.com https://fb.com/tailieudientucntt .c om Phân loại đệ quy th a n co ng Đệ quy gián tiếp ▸Đệ quy hỗ tương cu u du on g Đệ quy trực tiếp ▸Đệ quy tuyến tính ▸Đê qui nhị phân ▸Đệ quy phi tuyến CuuDuongThanCong.com https://fb.com/tailieudientucntt KieuDuLieu TenHam(Thamso) { if(Dieu Kien Dung) { ; return Gia tri tra ve; } ; TenHam(Thamso) ; } c om Đệ quy tuyến tính ng ▪ Là đệ quy có dạng th a n co P( ) { If (B) thực S; else { thực S* ; gọi P } } du on g Với S , S* thao tác khơng đệ quy ▪ VD: Hàm FAC(n) tính số hạng n dãy n! cu u int FAC( int n ) { if ( n == ) return ; else return ( n * FAC(n-1 )) ; } CuuDuongThanCong.com https://fb.com/tailieudientucntt ▪ Khử đệ quy với hàm tính giai thừa co ng c om int FAC ( int n ) { int k = 0; int F = 1; while ( k < n ) F = ++k * F; return (F); } th a n ▪ Khử đệ quy với hàm tính S(n) cu u du on g int S ( int n ) { int k = , tg = ; while ( k < n ) { k ++ ; if (k%2 == 1) tg + = * k -1; else tg -= * k + ; } return ( tg ) ; } CuuDuongThanCong.com https://fb.com/tailieudientucntt ▪ Xét thủ tục P dạng ▪ Trong đó: du on g th a n co P(X) ≡ if B(X) then D(X) else { A(X) ; P(f(X)) ; } ng c om Đệ quy dạng đệ quy đuôi cu u ▫ X tập biến (một nhiều biến) ▫ P(X) thủ tục đệ quy phụ thuộc X ▫ A(X); D(X) thao tác không đệ quy ▫ f(X) hàm biến đổi X CuuDuongThanCong.com https://fb.com/tailieudientucntt ng ▪ Xét trình thi hành P(X) : c om Đệ quy dạng đệ quy đuôi du on g th a n co ▫ gọi Po lần gọi P thứ (đầu tiên) P(X) ▫ P1 lần gọi P thứ (lần 2) P(f(X)) ▫ Pi lần gọi P thứ i (lần i + 1) P(f(f( f(X) ) ▫ ( P(fi(X)) hợp i lần hàm f ) ▪ Gọi Pi B(fi(X)) cu u ▫ (false) { A gọi Pi+1 } ▫ (true) { D } ▪ Giả sử P gọi n +1 lần Khi lần gọi cuối (thứ n ) Pn B(fn(X)) = true, lệnh D thi hành chấm dứt thao tác gọi thủ tục P CuuDuongThanCong.com https://fb.com/tailieudientucntt ▪Sơ đồ thực giải thuật vòng lặp c om Đệ quy dạng đệ quy đuôi cu u du on g th a n co ng While (!B(X)) { A(X); X = f(X); } D(X); CuuDuongThanCong.com https://fb.com/tailieudientucntt Ví dụ c Giải thuật đệ quy du on g th a n co ng Khử đệ quy int USCLN(int m, int n) { if (n == 0) return m; else USCLN(n, m % n); } cu u ▪X là( m , n ) ▪P(X) USCLN(m ,n) ▪B(X) n == ▪D(X) lệnh return m ▪A(X) lệnh rỗng ▪f(X ) f(m,n) = ( n , m mod n ) CuuDuongThanCong.com om Tìm ước chung lớn int USCLN(int m , int n ) { while(n != ) { int sd = m % n ; m = n ; n = sd ; } return (m) ; } https://fb.com/tailieudientucntt .c om Khử đệ quy stack cu u du on g th a n co ng ▪ Trạng thái tiến trình xử lý giải thuật: nội dung biến lệnh cần thực ▪ Với tiến trình xử lý giải thuật đệ quy thời điểm thực hiện, cần lưu trữ trạng thái xử lý dang dở ▪ Xét giải thuật giai thừa FAC ( n ) ≡ if(n = ) then return 1; else return ( n * FAC (n –1)); ▪ Sơ đồ thực CuuDuongThanCong.com https://fb.com/tailieudientucntt Thủ tục đệ quy tháp Hà Nội THN (n , A , B , C) c ng cu u du on g th a n co Sơ đồ thực THN(3,A,B,C) om THN (n : integer ; A ,B , C : char) ≡ { if (n > ) then { THN(n-1,A ,C ,B); Move(A, C); THN(n-1,B,A,C);} } CuuDuongThanCong.com https://fb.com/tailieudientucntt .c om Khử đệ quy stack cu u du on g th a n co ng ▪ Lời gọi đệ quy sinh lời gọi đệ quy gặp trường hợp suy biến (neo) ▪ Ở lần gọi, phải lưu trữ thông tin trạng thái dang dở tiến trình xử lý thời điểm gọi Số trạng thái số lần gọi chưa hoàn tất ▪ Khi thực xong (hoàn tất) lần gọi, cần khơi phục lại tồn thơng tin trạng thái trước gọi ▪ Lệnh gọi cuối (ứng với trương hợp neo) hoàn tất ▪ Cấu trúc liệu cho phép lưu trữ dãy thông tin thỏa yêu cầu cấu trúc lưu trữ thỏa mãn LIFO (Last In First Out ~ Cấu trúc stack) Chủ động tạo cấu trúc stack chuyên dụng CuuDuongThanCong.com https://fb.com/tailieudientucntt ▪ Đệ quy có dạng sau: du on g th a n co P(X) ≡ if C(X) then D(X) else begin A(X) ; P(f(X)) ; B(X) ; end; ng c om Đệ quy có lệnh gọi trực tiếp cu u ▫ X biến đơn biến véc tơ ▫ C(X) biểu thức boolean X ▫ A(X) , B(X) , D(X): không đệ quy ▫ f(X) hàm X CuuDuongThanCong.com https://fb.com/tailieudientucntt .c om Đệ quy có lệnh gọi trực tiếp ng ▪ Giải thuật thực P(X) với việc sử dụng Stack có dạng cu u du on g th a n co P(X) ≡ { Create_Stack (S); ( tạo stack S ) While(not(C(X)) begin A(X); Push(S,X); ( cất gía trị X vào stack S ) X := f(X); end; D(X); While(not(EmptyS(S))) begin POP(S,X); ( lấy liệu từ S ) B(X); end; } CuuDuongThanCong.com https://fb.com/tailieudientucntt Ví dụ c om Chuyển từ số thập phân sang nhị phân Khử đệ quy cu u Trong ▫X m ▫P(X) Binary(m) ▫A(X) ; D(X) lệnh rỗng ▫B(X) lệnh Write(m % ) ; ▫C(X) ( m ) begin sdu = m % ; Push(S,sdu) ; m = m / ; end; While(not(EmptyS(S)) begin POP(S,sdu) ; Write(sdu) ; end; } th a du on g Binary(m) ≡ if ( m > ) then begin Binary( m / ) ; write( m % ) ; end; ng Đệ quy https://fb.com/tailieudientucntt cu u du on g th a n P(X) ≡ if C(X) then D(X) else begin A(X); P(f(X)); B(X); P(g(X)); end; co ▪ Đệ quy có dạng sau ng c om Đệ quy với lần gọi đệ quy CuuDuongThanCong.com https://fb.com/tailieudientucntt .c om Đệ quy với lần gọi đệ quy ng ▪ Thuật toán khử đệ quy tương ứng với thủ tục đệ quy cu u du on g th a n co P(X) ≡ { Create_Stack (S) : Push (S, (X,1)) ; Repeat While ( not C(X) ) begin A(X) ; Push (S, (X,2)) ; X := f(X) ; end; D(X) ; POP (S, (X,k)) ; if ( k 1) then begin B(X) ; X := g(X) ; end; until ( k = ) ; } CuuDuongThanCong.com https://fb.com/tailieudientucntt Bài toán Tháp Hà Nội c ng co 1, X, Z, Y); Z ); 1, Y, X, Z); THN { Create_Stack (S) ; Push (S ,(n,X,Y,Z,1)) ; Repeat While (n > 0) begin Push (S ,(n,X,Y,Z,2)) ; n = n - 1; Swap (Y,Z) ; end ; Pop (S,(n,X,Y,Z,k)) ; if ( k ) then begin Move (X ,Z ) ; n = n - ; Swap (X,Y) ; end ; until ( k == ) ; } n ≡ if(n > 0) th a THN(n,X,Y,Z) { THN (n Move (X, THN (n } Khử đệ quy du on g Đệ quy om Ví dụ cu u Trong ▫Biến X (n,X,Y,Z) ▫C(X) n nhập từ bàn phím), tính tổng số hạng dãy CuuDuongThanCong.com https://fb.com/tailieudientucntt ... tốn ▫ Mã hóa giải thuật đệ quy ▫ Khử đệ quy để có chương trình khơng đệ quy cu u ▪ Tuy nhiên, khử đệ quy dễ => nhiều trường hợp ta phải chấp nhận sử dụng chương trình đệ quy CuuDuongThanCong.com... https://fb.com/tailieudientucntt .c om Phân loại đệ quy th a n co ng Đệ quy gián tiếp ? ?Đệ quy hỗ tương cu u du on g Đệ quy trực tiếp ? ?Đệ quy tuyến tính ▸Đê qui nhị phân ? ?Đệ quy phi tuyến CuuDuongThanCong.com... Khử đệ quy co ng ▪ Sơ đồ để xây dựng chương trình cho tốn khó ta khơng tìm giải thuật không đệ quy thường là: du on g th a n ▫ Dùng quan niệm đệ quy để tìm giải thuật cho tốn ▫ Mã hóa giải thuật

Ngày đăng: 28/12/2021, 19:12