giải thuật đệ quy Khái niệm đệ quy

14 380 0
giải thuật đệ quy  Khái niệm đệ 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

Khái niệm đệ quy Khái niệm đệ quy Bởi: Trần Hồng Thọ MỞ ĐẦU Mơ tả đệ quy Trong nhiều tình việc mơ tả tốn, giải thuật, kiện, vật trình, cấu trúc, đơn giản hiệu ta nhìn góc độ mang tính đệ qui Mơ tả mang tính đệ qui đối tượng 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ả Tức mơ tả đối tượng qua Các ví dụ : - Mô tả đệ quy tập số tự nhiên N : + Số số tự nhiên ( ∈ N) + Số tự nhiên số tự nhiên cộng ( n ∈ N ⇒ ( n +1 ) ∈ N ) - Mô tả đệ quy cấu trúc xâu (list) kiểu T : + Cấu trúc rỗng xâu kiểu T + Ghép nối thành phần kiểu T(nút kiểu T ) với xâu kiểu T ta có xâu kiểu T - Mô tả đệ quy gia phả : Gia phả người bao gồm mgười gia phả cha gia phả mẹ - Mô tả đê quy thủ tục chọn hoa hậu : + Chọn hoa hậu khu vực + Chọn hoa hậu hoa hậu - Mô tả đệ quy thủ tục tăng dãy a[m:n] ( dãy a[m], a[m+1], , a[n] ) phương pháp Sort_Merge (SM) : 1/14 Khái niệm đệ quy SM (a[m:n]) ≡ Merge ( SM(a[m : (n+m) div 2]) , SM (a[(n+m) div +1 : n] ) Với : SM (a[x : x]) thao tác rỗng (khơng làm ) Merge (a[x : y] , a[(y+1) : z]) thủ tục trộn dãy tăng a [x : y] , a[(y+1) : z] để dãy a[x : z] tăng - Đinh nghĩa đệ quy hàm giai thừa FAC( n) = n ! ! = n!=n*(n-1)! Phương pháp đệ quy mạnh chổ cho phép mơ tả tập lớn đối tượng số mệnh đề mơ tả giải thuật phức tạp số thao tác (một chương trình đệ quy) Một mơ tả đệ quy đầy đủ gồm phần : - Phần neo : mô tả trường hợp suy biến đối tượng (giải thuật) qua cấu trúc (thao tác) cụ thể xác định số tự nhiên, cấu trúc rỗng xâu kiểu T, ! = , SM (a[x:x]) thao tác rỗng - Phần quy nạp: mô tả đối tượng (giải thuật) trường hợp phổ biến thơng qua đối tượng (giải thuật ) cách trực tiếp gián tiếp 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]) ) Nếu mơ tả khơng có phần neo đối tượng mơ tả có cấu trúc lớn vơ hạn, giải thuật mơ tả trở thành cấu trúc lặp vô tận Các loại đệ quy Người ta phân đệ quy thành loại : Đệ quy trực tiếp, đệ quy gián tiếp - Đệ quy trực tiếp loại đệ quy mà đối tượng mơ tả trực tiếp qua : A mơ tả qua A, B, C, B, C, khơng chứa A (các ví dụ trên) - Đệ quy gián tiếp loại đệ quy mà đối tượng mơ tả gián tiếp qua : A mơ tả qua A1 ,A2 , , An Trong có Ai mơ tả qua A Ví dụ 1: Mơ tả dạng tổng qt chương trình viết NNLT Pascal : Một Chương trình Pascal gồm : a) Đầu chương trình (head) gồm: Program Tên ; 2/14 Khái niệm đệ quy b) Thân chương trình (blok) gồm : b1) Khai báo unit, định nghĩa hằng, nhãn, kiểu liệu, khái báo biến b2) Định nghĩa chương trình gồm : b2.1) Đầu chương trình : Procedure Tên thủ tục ( danh sách thơng số hình thức ) ; Function Tên hàm ( danh sách thông số hình thức ) : Kiểu ; b2.2) Thân chương trình ( Blok ) b2.3) Dấu ‘ ; ‘ b3) Phần lệnh : lệnh ghép dạng : Begin S1 ; S2 ; ; Sn End ; c) Dấu kết thúc chương trình : ‘.’ Mô tả hai dãy số {Xn},{Yn} theo luật đệ quy hổ tương sau : X0 = ; Xn = Xn-1 + Yn-1 ; Y0 = ; Yn =n2 Xn-1 + Yn-1 MÔ TẢ ĐỆ QUY CÁC CẤU TRÚC DỮ LIỆU Trong tốn học , lập trình người ta thường sử dụng đệ quy để mô tả cấu trúc phức tạp, có tính đệ quy Bởi mô tả đệ quy không cách mô tả ngắn gọn cấu trúc phức tạp mà tạo khả để xây dựng thao tác xử lý cấu trúc phức tạp giải thuật đệ qui Một cấu trúc liệu có tính đệ quy thường gồm số thành phần liệu kiểu ghép nối theo phương thức Mô tả đệ quy nhi phân : Cây nhi phân kiểu T : + Hoặc cấu trúc rỗng (phần neo) + Hoặc nút kiểu T (nút gốc) nhị phân kiểu T rời (cây nhị phân phải, nhị phân trái) kết hợp với Mô tả đệ quy mảng nhiều chiều : + Mảng chiều dãy có thứ tự thành phần kiểu + Mảng n chiều mảng chiều mà thành phần có kiểu mảng n-1 chiều 3/14 Khái niệm đệ quy MÔ TẢ ĐỆ QUY GIẢI THUẬT Giải thuật đệ quy Giải thuật đệ quy giải thuật có chứa thao tác gọi đến Giải thuật đệ quy cho phép mô tả dãy lớn thao tác số thao tác có chứa thao tác gọi lại giải thuật (gọi đệ quy) Một cách tổng quát giải thuật đệ quy biểu diễn P gồm mệnh đề S (không chứa yếu tố đệ quy ) P : P ≡ P[ S , P ] Thực thi giải thuật đệ quy dẫn tới tiến trình gọi đê quy khơng kết thúc khơng có khả gặp trường hợp neo, quan tâm đến điều kiện dừng giải thuật đệ quy đặt Để kiểm sốt qúa trình gọi đệ quy giải thuật đệ quy P người ta thường gắn thao tác gọi P với việc kiểm tra điều kiện B xác định biến đổi qua lần gọi P , qúa trình gọi P sẻ dừng B khơng thỏa Mơ hình tổng qt giải thuật đệ quy với quan tâm đến dừng sẻ : P ≡ if B then P[ S , P ] P ≡ P[ S , if B then P ] Thông thường với giải thuật đệ quy P , để đảm bảo P sẻ dừng sau n lần gọi ta chọn B ( n >0 ) Mơ hình giải thuật đệ quy có dạng : P(n) ≡ If ( n > ) then P[ S , P(n - 1)] ; P(n) ≡ P[ S , if (n >0) then P(n - 1) ] ; Trong ứng dụng thực tế số lần gọi đệ quy (độ sâu đệ quy) phải hữu hạn mà phải đủ nhỏ Bởi lần gọi đệ quy cần vùng nhớ vùng nhớ cũ phải trì Chương trình đệ quy Các hàm đệ quy Định nghĩa hàm số đệ quy thường gặp tốn học, điển hình hàm ngun mơ tả dãy số hồi quy Dãy giai thừa : { n! } ≡ ,1 , , , 24 , 120 , 720 , 5040 , 4/14 Khái niệm đệ quy Ký hiệu FAC(n ) = n ! Ta có : + FAC(0 ) = ; ( ! = ) + FAC(n ) = n * FAC(n - ) ; ( n ! = n * (n - ) ! ) với n >= Giải thuật đệ quy tính FAC(n ) : FAC(n ) ≡ if (n = ) then return ; else return (n * FAC(n - )) ; Dãy số Fibonaci(FIBO) : { FIBO (n) } ≡ ,1 , , , , , 13 , 21 , 34 , 55 , 89 , 144 , 233 , 377 , + FIBO(0 ) = FIBO (1 ) = ; + FIBO(n ) = FIBO (n - ) + FIBO ( n - ) ; với n > = Giải thuật đệ quy tính FIBO ( n ) : FIBO(n) ≡ if ((n = ) or ( n = )) then return ; else return ( FIBO (n - 1) + FIBO (n - 2)) Dãy tổ hợp : C0n = với n>=0 Cmn = với m > n > Cmn = Cmn −− 11 + Cmn − với n>m>0 Giải thuật đệ quy tính Cmn : If (m=0) then return 1; 5/14 Khái niệm đệ quy Else if (m>n) then return 0; Else return ( Cmn −− 11 + Cmn − ) ; Nhận xét : Một định nghĩa hàm đệ quy bao gồm : + Một số trường hợp suy biến mà gía trị hàm biết trước tính cách đơn giản (không đệ quy ) Như : FAC(0 ) = , FIBO(0) = FIBO(1) = , C0n = , Cmn = với m > n > + Trường hợp tổng quát việc tính hàm sẻ đươc đưa tính hàm giá trị “ bé hơn” (gần với giá trị neo) đối số Như : FAC(n ) = n * FAC(n - ) ; FIBO(n) = FIBO(n -1) + FIBO( n - ) Trong tập biến hàm có nhóm mà độ lớn định độ phức tạp việc tính gía trị hàm Nhóm biến gọi nhóm biến điều khiển Gía trị biên nhóm biến điều khiển ứng với trường hợp suy biến Gía trị nhóm biến điều khiển sẻ thay đổi qua lần gọi đệ quy với xu hướng tiến đến gía trị biên ( tương ứng với trường hợp suy biến hàm ) Các thủ tục đệ quy Thủ tục đệ quy thủ tục có chứa lệnh gọi đến Thủ tục đệ quy thường sử dụng để mô tả thao tác cấu trúc liệu có tính đệ quy Xem dãy n phần tử a[1:n] kết hợp dãy a[1:n-1] a[n] Do đo : - Thủ tục tìm max dãy a[1:n] ( thủ tục TMax) thực theo luật đệ qui : + Tìm max dãy a[1:n] (gọi đệ quy Tmax(a[1:n-1] ) ) + Tìm max số : Tmax(a[1:n-1]) a[n] (giải thuật không đệ quy) Tức : 6/14 Khái niệm đệ quy TMax(a[1:n]) = max(TMax(a[1:n-l]) , a[n] ) với TMax(a[m:m] = a[m] ; ( trường hợp neo ) max(x,y) = x > y ? x : y ; ( giải thuật tính max số : if (x>y) then max(x ,y) = x else max(x ,y) = y ) - Thủ tục tính tổng phần tử ( thủ tục TSUM ) thực theo luật đệ quy : + Tìm tổng dãy a[1:n] (gọi đệ quy TSUM(a[1:n-1]) ) + Tìm tổng số : TSUM(a[1:n-1]) a[n] (giải thuật không đệ quy) Tức : TSUM(a[1:n]) = a[n] + TSUM(a[1:n-1] với TSUM(a[m:m]) = a[m] Xem dãy a[m : n] kết nối hai dãy: dãy a[m:((m+n) div 2)] dãy a[(((m+n) div 2)+1) :n] Do đo : - Thủ tục tìm max dãy a[1:n] ( thủ tục Tmax1) thực theo luật đệ qui : + Tìm max dãy trái a[m:((m+n) div 2)] (gọi đệ quy Tmax1(a[m:((m+n) div 2)] ) ) + Tìm max dãy phải a[(((m+n) div 2)+1) :n] (gọi đệ quy Tmax1(a[(((m+n) div 2)+1) :n] ) + Tìm max số : Tmax1(a[m:((m+n) div 2)] ) Tmax1(a[(((m+n) div 2)+1) :n] ) (giải thuật không đệ quy) Tức :Tmax1(a[m:n]) = max(Tmax1(a[m:((m+n) div 2)] ) ,Tmax1(a[(((m+n) div 2)+1) :n]) ) với Tmax1(a[m:m] = a[m] ; ( trường hợp neo ) 7/14 Khái niệm đệ quy max(x,y) = x > y ? x : y ; - Thủ tục tính tổng phần tử ( TSUM1 ) thực theo luật đệ quy : + Tìm tổng dãy trái a[m:((m+n) div 2)] (gọi đệ quy TSUM1 (a[m:((m+n) div 2)] ) ) + Tìm tổng dãy phải a[(((m+n) div 2)+1) :n] (gọi đệ quy TSUM1 (a[(((m+n) div 2)+1) :n] ) ) + Tìm tổng số : TSUM1 (a[m:((m+n) div 2)] ) TSUM1 (a[(((m+n) div 2)+1) :n] ) Tức : TSUM1 (a[m:n]) = TSUM1 (a[m:((m+n) div 2)]) + TSUM1 (a[(((m+n) div 2)+1) :n] ) với TSUM1 (a[m:m]) = a[m] Cây nhị phân tìm kiếm kiểu T(BST) cấu trúc gồm : nút kiểu T kết nối với nhi phân tìm kiếm kiểu T nên : - Thụ tục quét nhi nhân tìm kiếm theo thứ tự (LNF) : + Quét trái theo thứ tự ; + Thăm nút gốc ; + Quét phải theo thứ tự ; - Thủ tục tìm kiếm giá tri o nhị phân tìm kiếm Root : Nếu Root ≡ ∅ thực thao tác rỗng (khơng làm ) Con khơng giá trị nút gốc = αo thơng báo tìm thấy dừng Còn khơng giá trị nút gốc < αo tìm trái Còn khơng tìm phải Nhận xét : Trong thủ tục đệ qui, việc gọi đệ quy dừng lại sau hữu hạn lần gọi cần chứa điều kiện kiểm tra (một biểu thức boolean B nhóm biến ) , để điều kiện khơng thỏa việc gọi đệ qui kết thúc 8/14 Khái niệm đệ quy Dạng thường gặp thủ tục đệ qui : S1 ; ( không chứa yếu tố đệ qui ) if B then S2 ( phần lệnh trực tiếp , lệnh gọi đệ qui ) else Sdq ; ( phần lệnh có lệnh gọi đệ qui ) S3 ; (khơng có gọi đệ qui ) Mã hóa giải thuật đệ qui ngơn ngữ lập trình Tổng quan Khơng phải ngơn ngữ lập trình có mã hóa giải thuật đệ quy, số ngơn ngữ lập trình có khả tổ chức vùng nhớ kiểu stack có khả mã hóa giải thuật đệ quy Các ngơn ngữ lập trình mã hóa giải thuật đệ quy cách tổ chức chương trình đệ quy tương ứng Thể đệ qui NNLT PASCAL C++ NN LT Pascal C++ cho phép mã hóa giải thuật đệ quy cách tổ chức chương trình đê quy nhờ vào chế tạo vùng nhớ Stak phần mềm ngôn ngữ Trong NNLT C++ NNLT C++ cho phép mã hóa giải thuật đệ quy cách thuận lợi nhờ vào kỹ thuật khai báo trước tiêu đề nên khơng có phân biệt hình thức việc khai báo hàm đệ quy hàm không đệ quy Trong NN LT Pascal Đối với chương trình đệ quy trực tiếp hình thức khai báo giống chương trình khơng đệ quy Đối với chương trình đệ quy gián tiếp hình thức khai báo có thay đổi nhiều nhằm thỏa quy tắc tầm vực ngôn ngữ ( phần lệnh chương trình gọi chương trình cấp khai báo trước ) Với mơ hình chương trình sau : Trong phần lệnh khối A gọi đến : 9/14 Khái niệm đệ quy + Gọi chương trình trực tiếp gọi B khơng gọi C + Gọi ( gọi đệ quy ) + Gọi chương trình cấp nhưmg phải khai báo trước gọi E không gọi D , Muốn gọi D phải khai báo trước ( khai báo FORWARD) Để từ thủ tục hàm A gọi đến D thủ tục hàm cấp mô tả sau A, ta cần có khai báo trước D phía trước A Khai báo gồm : tiêu đề D, với danh sách thông số D, từ khố FORWARD Sau lúc mơ tả lại D cần khai báo từ khố PROCEDURE ( FUNCTION ) , tên D ( khơng có danh sách thơng số ) , phần thân D Với thủ tục gọi đệ quy hỗ tương FIRST,SECOND khai báo sau : procedure SECOND (i : integer ) ; Forward ; procedure FIRST (n : integer ; var X : real); var j, k : interger ; begin for j := to n begin writeln(‘ j = ‘, j ) ; k := n - 2* j ; SECOND( k ); end ; end ; 10/14 Khái niệm đệ quy procedure second ; begin if ( i > ) then begin writeln(‘ i= ‘, i ); FIRST( i - ) ; end ; end ; Một số dạng giải thuật đệ quy đơn giản thường gặp Đệ quy tuyến tính Chương trình đệ quy tuyến tính chương trình đệ quy trực tiếp đơn giản có dạng : P ≡ { NẾU thỏa điều kiện dừng thực S ; Còn khơng begin { thực S* ; gọi P } } Với S , S* thao tác không đệ quy Hàm FAC(n) tính số hạng n dãy n! + Dạng hàm ngôn ngữ mã giả : { Nếu n = FAC = ; /* trường hợp neo */ Còn khơng FAC = n*FAC(n-1) } + Dạng hàm ngôn ngữ Pascal : Function FAC(n : integer) : integer; begin if( n = ) then FAC := else FAC := n*FAC(n-1) ; end; + Dạng hàm C++ : int FAC( int n ) { if ( n == ) return ; else return ( n * FAC(n-1 )) ; 11/14 Khái niệm đệ quy } Chương trình tính USCLN số dựa vào thuật toán Euclide : + Dạng hàm ngơn ngữ tốn học : USCLN(m , n ) = USCLN(n , m mod n ) n ≠ USCLN(m , 0) = m + Dạng hàm ngôn ngữ mã giả : Nếu n = USCLN = m Còn khơng USCLN = USCLN( n , m mod n ) ; + Dạng hàm Pascal : Function USCLN(m , n : integer ) : integer ; begin if (n = ) then USCLN := m else USCLN := USCLN( n , m mod n ) ; end ; +Dạng hàm C++ : int USCLN( int m , int n ) { if(n == ) return (m) ; else return ( USCLN( n , m mod n)) ; } Đệ quy nhị phân Chương trình đệ quy nhị phân chương trình đệ quy trực tiếp có dạng : P ≡ { NẾU thỏa điều kiện dừng thực S ; Còn khơng begin { thực S* ; gọi P ; gọi P } 12/14 Khái niệm đệ quy } Với S , S* thao tác khơng đệ quy Hàm FIBO(n) tính số hạng n dãy FIBONACCI + Dạng hàm Pascal: Function F(n : integer) : integer; begin if( n < ) then F := else F := F(n-1) + F(n-2) end; + Dạng hàm C++ : int F(int n) { if ( n < ) return ; else return (F(n -1) + F(n -2)) ; } Đệ quy phi tuyến Chương trình đệ quy phi tuyến chương trình đệ quy trực tiếp mà lời gọi đệ quy thực bên vòng lặp Dạng tổng quát chương trình đệ quy phi tuyến : P ≡ { for giá tri đầu to giá trị cuối begin thực S ; if ( thỏa điều kiện dừng ) then thực S* else gọi P end ; } Với S , S* thao tác không đệ quy Cho dãy { Xn } xác định theo công thức truy hồi : X0 = ; Xn = n2 XO +(n-1)2 X1 + + 2 Xn-2 + Xn-1 + Dạng hàm đệ quy tính Xn ngơn ngữ mã giả : 13/14 Khái niệm đệ quy Xn ≡ if ( n= ) then return ; else { tg = ; for i = to n-1 tg = tg + (n-i)2 Xi ; return tg ; } + Dạng hàm đệ quy tính Xn ngơn ngữ Pascal : function X( n :integer) : integer ; var i , tg : integer ; begin if ( n= ) then X := else begin tg = ; for i: = to n-1 tg : = tg + sqr(n-i) *X(i) ; X := tg ; end ; end ; + Dạng hàm đệ quy tính Xn ngơn ngữ C++ : int X( int n ) ; { if ( n == ) return ; else { int tg = ; for (int i = ; i

Ngày đăng: 07/03/2018, 03:41

Mục lục

    Khái niệm đệ quy

    Mô tả đệ quy

    Các loại đệ quy

    MÔ TẢ ĐỆ QUY CÁC CẤU TRÚC DỮ LIỆU

    MÔ TẢ ĐỆ QUY GIẢI THUẬT

    Thể hiện đệ qui trong NNLT PASCAL và C++

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

Tài liệu liên quan