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

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

Đ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

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

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan