Giáo trình Lập trình nâng cao - Chương 5: Lập trình đệ quy - Phạm Đào Minh Vũ

pdf 12 trang huongle 1960
Bạn đang xem tài liệu "Giáo trình Lập trình nâng cao - Chương 5: Lập trình đệ quy - Phạm Đào Minh Vũ", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfgiao_trinh_lap_trinh_nang_cao_chuong_5_lap_trinh_de_quy_pham.pdf

Nội dung text: Giáo trình Lập trình nâng cao - Chương 5: Lập trình đệ quy - Phạm Đào Minh Vũ

  1. CHƢƠNG 5 Lập trình đệ qui
  2. Khái niệm  Một hàm được gọi có tính đệ qui nếu trong thân của hàm đó có lệnh gọi lại chính nó một cách tường minh hay tiềm ẩn.  Phân loại đệqui  Đệ qui tuyến tính.  Đệqui nhịphân.  Đệqui phi tuyến.  Đệqui hỗ tương. 2
  3. Đệ qui tuyến tính • Trong thân hàm có duy nhất một lời gọi hàm gọi lại chính nó một cách tường minh. TenHam ( ) { if (điều kiện dừng) { . . . //Trả về giá trị hay kết thúc công việc } //Thực hiện một số công việc (nếu có) . . . TenHam ( ); //Thực hiện một số công việc (nếu có) } 3
  4. Đệ qui tuyến tính (tt) Ví dụ: Tính S(n) 1 2 3  n - Điều kiện dừng: S(0) = 0. - Qui tắc (công thức) tính: S(n) = S(n-1) + n. long TongS (int n) { if(n==0) return 0; return ( TongS(n-1) + n ); } 4
  5. Đệ qui nhịphân • Trong thân của hàm có hai lời gọi hàm gọi lại chính nómộ t cách tường minh. TenHam ( ) { if (điều kiện dừng) { . . . //Trả về giá trị hay kết thúc công việc } //Thực hiện một số công việc (nếu có) . . .TenHam ( ); //Giải quyết vấn đề nhỏ hơn //Thực hiện một số công việc (nếu có) . . . TenHam ( ); //Giải quyết vấn đề còn lại //Thực hiện một số công việc (nếu có) } 5
  6. Đệ qui nhịphân (tt) Ví dụ: Tính số hạng thứ n của dãy Fibonaci được định nghĩa như sau: f1 = f0 =1 ; fn = fn-1 + fn-2 ; (n>1) Điều kiện dừng: f(0) = f(1) = 1. long Fibonaci (int n) { if(n==0 || n==1) return 1; return Fibonaci(n-1) + Fibonaci(n-2); } 6
  7. Đệ qui phi tuyến  Trong thân của hàm có lời gọi hàm gọi lại chính nó được đặt bên trong vòng lặp. TenHam ( ) { for (int i = 1; i ); } } 7 }
  8. Đệ qui phi tuyến (tt) Ví dụ: Tính số hạng thứ n của dãy {Xn} được định nghĩa như sau: X0 =1 ; 2 2 2 Xn = n X0 + (n-1) X1 + + 1 Xn-1 ; (n≥1) Điều kiện dừng:X(0) = 1. long TinhXn (int n) { if(n==0) return 1; long s = 0; for (int i=1; i<=n; i++) s = s + i * i * TinhXn(n-i); return s; } 8
  9. Đệ qui hỗtƣơng  Trong thân của hàm này có lời gọi hàm đến hàm kia và trong thân của hàm kia có lời gọi hàm tới hàm này. g() f() f() f() g() h() 9
  10. Đệ qui hỗtƣơng (tt) TenHam2 ( ); TenHam1 ( ) { //Thực hiện một số công việc (nếu có) TenHam2 ( ); //Thực hiện một số công việc (nếu có) } TenHam2 ( ) { //Thực hiện một số công việc (nếu có) TenHam1 ( ); //Thực hiện một số công việc (nếu có) } 10
  11. Ví dụ: Tính số hạng thứ n của hai dãy {Xn}, {Yn} được định nghĩa như sau: X0 =Y0 =1 ; Xn = Xn-1 + Yn-1; (n>0) 2 Yn = n Xn-1 + Yn-1; (n>0) - Điều kiện dừng:X(0) = Y(0) = 1. long TinhYn(int n); long TinhXn (int n) { if(n==0) return 1; return TinhXn(n-1) + TinhYn(n-1); } long TinhYn (int n) { if(n==0) return 1; return n*n*TinhXn(n-1) + TinhYn(n-1); } 11
  12. Cách hoạt động hàm đệ qui  Ví dụ tính n! với n=5 int GiaiThua(int n) { if(n==1) return 1; return GiaiThua(n-1)*n; } main() GiaiThua(5) GiaiThua(4) GiaiThua(3) GiaiThua(2) GiaiThua(1) 5 4 3 2 1 n 5 n 5 n 4 n 3 n 2 n 1 120 24 6 2 1 12