1. Trang chủ
  2. » Công Nghệ Thông Tin

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

50 8 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 1,75 MB

Nội dung

Bài giảng Kỹ thuật lập trình – Chương 6: Kỹ thuật đệ quy. Chương này gồm có những nội dung chính sau: Mô tả đệ quy, thực hiện tính giai thừa, trạng thái hệ thống khi tính giai thừa, thành phần của mô tả đệ quy, phân loại đệ quy, đệ quy nhị phân, đệ quy phi tuyến, đệ quy tương hỗ,… Mời các bạn cùng tham khảo.

.c om ng co cu u du o ng th an Kỹ thuật đệ quy CuuDuongThanCong.com https://fb.com/tailieudientucntt .c om ng co th an Nhắc lại kỹ thuật Đệ quy cu u du o ng Recursive CuuDuongThanCong.com https://fb.com/tailieudientucntt an cu u du o ng th 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 .c 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 ng th an co ng 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 du o 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  th ng Mã C++ an co ng  int factorial(int n) { if (n==0) return 1; else return (n * factorial(n - 1)); } du o u cu Ví dụ CuuDuongThanCong.com https://fb.com/tailieudientucntt .c om Thực tính giai thừa n=3 n=1 2*factorial(1) cu u factorial (1) du o … th 3*factorial(2) ng n=2 an factorial (2) … co ng factorial (3) … factorial (0) 1*factorial(0) n=0 … return 1; 1 CuuDuongThanCong.com https://fb.com/tailieudientucntt an factorial(0) co ng Stack hệ thống c om Trạng thái hệ thống tính giai thừa th factorial(1) factorial(1) factorial(1) ng factorial(2) factorial(2) factorial(2) factorial(2) factorial(2) du o 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 ) CuuDuongThanCong.com Trả từ hàm factorial(1 ) Trả từ hàm factorial(2 ) https://fb.com/tailieudientucntt Trả từ hàm factorial(3 ) t .c om Thành phần mô tả đệ quy ng ▪ Phần neo: trường hợp suy biến đối tượng an 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 ng th ▪ 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 du o 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 an co ng Đệ quy gián tiếp ▸Đệ quy hỗ tương cu u du o ng Đệ 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 an co P( ) { If (B) thực S; else { thực S* ; gọi P } } du o ng 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 an ▪ Khử đệ quy với hàm tính S(n) cu u du o ng 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 .c om Đệ quy dạng đệ quy đuôi co ng ▪ Xét thủ tục P dạng ▪ Trong đó: du o ng th an P(X) ≡ if B(X) then D(X) else { A(X) ; P(f(X)) ; } 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 .c om Đệ quy dạng đệ quy ng ▪ Xét q trình thi hành P(X) : du o ▪ Gọi Pi B(fi(X)) ng th an 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 ) 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 o ng th an co ng While (!B(X)) { A(X); X = f(X); } D(X); CuuDuongThanCong.com https://fb.com/tailieudientucntt Tìm ước chung lớn Giải thuật đệ quy du o ng th an 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 c om Ví dụ 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 o ng th an 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 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);} } cu u du o ng th an co ng Sơ đồ thực THN(3,A,B,C) CuuDuongThanCong.com https://fb.com/tailieudientucntt .c om Khử đệ quy stack cu u du o ng th an 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 .c om Đệ quy có lệnh gọi trực tiếp co ng ▪ Đệ quy có dạng sau: du o ng th an P(X) ≡ if C(X) then D(X) else begin A(X) ; P(f(X)) ; B(X) ; end; 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 o ng th an 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 Binary(m) ≡ if ( m > ) then begin Binary( m / ) ; write( m % ) ; end; Binary (m) ≡ { Create_Stack(S); While ( m > ) begin sdu = m % ; Push(S,sdu) ; m = m / ; end; While(not(EmptyS(S)) begin POP(S,sdu) ; Write(sdu) ; end; } du o ng th an co ng Đệ 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 0) ng THN(n,X,Y,Z) { THN (n Move (X, THN (n } c om Bài toán Tháp Hà Nội https://fb.com/tailieudientucntt .c om ng u du o ng th an co Sau đó, khử đệ quy chương trình cu Ví dụ Cho dãy số 1,2,3,7,14,27,55,110,219 Viết hàm đệ quy tính số hạng thứ n dãy số (n > nhập từ bàn phím), tính tổng số hạng dãy CuuDuongThanCong.com https://fb.com/tailieudientucntt ... 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à: ng th an ▫ Dùng quan niệm đệ quy để tìm giải thuật cho tốn ▫ Mã hóa giải thuật đệ quy. .. https://fb.com/tailieudientucntt .c om Phân loại đệ quy th an co ng Đệ quy gián tiếp ? ?Đệ quy hỗ tương cu u du o ng Đệ quy trực tiếp ? ?Đệ quy tuyến tính ▸Đê qui nhị phân ? ?Đệ quy phi tuyến CuuDuongThanCong.com... hóa giải thuật đệ quy ▫ Khử đệ quy để có chương trình khơng đệ quy cu u du o ▪ 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

Ngày đăng: 19/06/2021, 07:15