SlideShare a Scribd company logo
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Chương 5: Đệ qui
Khái niệm đệ qui Khái niệm (định nghĩa) đệ qui có dùng lại chính nó. Ví dụ:  giai thừa  của n là 1 nếu n là 0 hoặc là n nhân cho  giai thừa  của n-1 nếu n > 0 Quá trình đệ qui gồm 2 phần: Trường hợp cơ sở (base case) Trường hợp đệ qui: cố gắng tiến về trường hợp cơ sở Ví dụ trên: Giai thừa của n là 1 nếu n là 0 Giai thừa của n là n * (giai thừa của n-1) nếu n>0
Tính giai thừa Định nghĩa không đệ qui: n! = n * (n-1) * … * 1 Định nghĩa đệ qui: n! =  1 nếu n=0 n * (n-1)! nếu n>0 Mã C++: int  factorial( int  n) { if  (n==0)  return  1; else   return  (n * factorial(n - 1)); }
Thi hành hàm tính giai thừa 1 1 6 2 n=2 … 2*factorial(1) factorial (2) n=1 … 1*factorial(0) factorial (1) n=0 … return 1; factorial (0) n=3 … 3*factorial(2) factorial (3)
Trạng thái hệ thống khi thi hành hàm tính giai thừa factorial(3) factorial(3) factorial(2) factorial(3) factorial(2) factorial(1) factorial(3) factorial(2) factorial(1) factorial(0) factorial(3) factorial(2) factorial(1) factorial(3) factorial(2) factorial(3) t Gọi hàm factorial(3) Gọi hàm factorial(2) Gọi hàm factorial(1) Gọi hàm factorial(0) Trả về từ hàm factorial(0) Trả về từ hàm factorial(1) Trả về từ hàm factorial(2) Trả về từ hàm factorial(3) Stack hệ thống Thời gian hệ thống t
Bài toán Tháp Hà nội Luật: Di chuyển mỗi lần một đĩa Không được đặt đĩa lớn lên trên đĩa nhỏ
Bài toán Tháp Hà nội – Thiết kế hàm Hàm đệ qui: Chuyển (count-1) đĩa trên đỉnh của cột start sang cột temp Chuyển 1 đĩa (cuối cùng) của cột start sang cột finish Chuyển count-1 đĩa từ cột temp sang cột finish magic
Bài toán Tháp Hà nội – Mã C++ void  move( int  count,  int  start,  int  finish,  int  temp) { if  (count > 0) { move(count − 1, start, temp, finish); cout << &quot;Move disk &quot; << count << &quot; from &quot; << start << &quot; to &quot; << finish << &quot;.&quot; << endl; move(count − 1, temp, finish, start); } }
Bài toán Tháp Hà nội – Thi hành
Bài toán Tháp Hà nội – Cây đệ qui
Thiết kế các giải thuật đệ qui Tìm bước chính yếu (bước đệ qui) Tìm qui tắc ngừng Phác thảo giải thuật Dùng câu lệnh if để lựa chọn trường hợp. Kiểm tra điều kiện ngừng Đảm bảo là giải thuật luôn dừng lại. Vẽ cây đệ qui Chiều cao cây ảnh hưởng lượng bộ nhớ cần thiết. Số nút là số lần bước chính yếu được thi hành.
Cây thi hành và stack hệ thống Cây thi hành
Đệ qui đuôi (tail recursion) Định nghĩa: câu lệnh thực thi cuối cùng là lời gọi đệ qui đến chính nó. Khử: chuyển thành vòng lặp.
Khử đệ qui đuôi hàm giai thừa Giải thuật: product=1 for  ( int  count=1; count < n; count++) product *= count;
Dãy số Fibonacci Định nghĩa:  F 0  = 0 F 1  = 1 F n  = F n-1  + F n-2  khi n>2 Ví dụ: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, … Hàm đệ qui: int  fibonacci ( int  n) { if  (n<=0)  return  0; if  (n==1)  return  1; else   return  (fibonacci(n-1) + fibonacci(n-2)); }
Dãy số Fibonacci – Cây thi hành Đã tính rồi
Dãy số Fibonacci – Khử đệ qui Nguyên tắc: Dùng biến lưu trữ giá trị đã tính của F n-2 Dùng biến lưu trữ giá trị đã tính của F n-1 Tính F n  = F n-1  + F n-2  và lưu lại để dùng cho lần sau Giải thuật: int  Fn2=0, Fn1=1, Fn; for  ( int  i = 2; i <= n; i++) { Fn = Fn1 + Fn2; Fn2 = Fn1; Fn1 = Fn; }
Bài toán 8 con Hậu
Bài toán 4 con Hậu
Bài toán 8 con Hậu – Giải thuật Algorithm  Solve Input  trạng thái bàn cờ Output 1.  if  trạng thái bàn cờ chứa đủ 8 con hậu 1.1. In trạng thái này ra màn hình 2.  else 2.1.  for  mỗi ô trên bàn cờ mà còn  an toàn 2.1.1.  thêm một con hậu vào ô này 2.1.2.  dùng lại giải thuật Solve với trạng thái mới 2.1.3.  bỏ con hậu ra khỏi ô này End  Solve Vét cạn
Bài toán 8 con Hậu – Thiết kế phương thức
Bài toán 8 con Hậu – Thiết kế dữ liệu đơn giản const int  max_board = 30 ; class  Queens { public: Queens( int  size) ; bool  is_solved( )  const; void  print( )  const; bool  unguarded( int  col)  const; void  insert( int  col) ; void  remove( int  col) ; int  board_size ; //  dimension of board = maximum number of queens private: int  count ; //  current number of queens = first unoccupied row bool  queen_square[max_board][max_board] ; } ;
Bài toán 8 con Hậu – Mã C++ void  Queens  ::  insert( int  col) { queen_square[count++][col] =  true; } bool  Queens  ::  unguarded( int  col)  const  { int  i ; bool  ok =  true;  for  (i = 0 ;  ok && i < count ;  i++)  //kiểm tra tại một cột ok = !queen_square[i][col] ;  //kiểm tra trên đường chéo lên for  (i = 1 ;  ok && count − i >= 0 && col − i >= 0 ;  i++) ok = !queen_square[count − i][col − i] ; //kiểm tra trên đường chéo xuống for  (i = 1 ;  ok && count − i >= 0 && col + i < board_size ;  i++) ok = !queen_square[count − i][col + i] ; return  ok ; }
Bài toán 8 con Hậu – Góc nhìn khác
Bài toán 8 con Hậu – Thiết kế mới const int  max_board = 30 ; class  Queens { public: Queens( int  size) ; bool  is_solved( )  const; void  print( )  const; bool  unguarded( int  col)  const; void  insert( int  col) ; void  remove( int  col) ; int  board size ; private: int  count ; bool  col_free[max board] ; bool  upward_free[2 * max board − 1] ; bool  downward_free[2 * max board − 1] ; int  queen_in_row[max board] ; // column number of queen in each row } ;
Bài toán 8 con Hậu – Mã C++ mới Queens  ::  Queens( int  size) { board size = size ; count = 0 ; for  ( int  i = 0 ;  i < board_size ;  i++) col_free[i] =  true; for  ( int  j = 0 ;  j < (2 * board_size − 1) ;  j++) upward_free[j] =  true; for  ( int  k = 0 ;  k < (2 * board_size − 1) ;  k++) downward_free[k] =  true; } void  Queens  ::  insert( int  col) { queen_in_row[count] = col ; col_free[col] =  false; upward_free[count + col] =  false; downward_free[count − col + board size − 1] =  false; count++ ; }
Bài toán 8 con Hậu – Đánh giá Thiết kế đầu Thiết kế mới

More Related Content

PPT
Ctdl C01
PPT
Ctdl C02
PPT
Ctdl C04
PDF
Tut6 solution
PDF
Tut5 solution
PDF
Huong dan su dung va debug voi dev c++
DOCX
Hướng dẫn làm bt về chuỗi.doc
PPT
Nmlt c06 ham
Ctdl C01
Ctdl C02
Ctdl C04
Tut6 solution
Tut5 solution
Huong dan su dung va debug voi dev c++
Hướng dẫn làm bt về chuỗi.doc
Nmlt c06 ham

What's hot (19)

PDF
Local sakainame 501127 ktl_trình hlmt1 a01 fall 2013 _ modules
PPT
Bai 11 kieu mang (tiet 1)
PDF
Ktlt lab full
PDF
PPT
Kiểu Mảng 1 chiều
PPT
Nmlt c11 con_trocoban-
PPT
Nmlt c08 mang2_chieu
DOCX
bai tap cau truc du lieu ptit
PDF
Debug trong c
PDF
Stl string
PDF
4 matlab ly-thuyet_dohoa_
PPT
Nmlt c07 mang1_chieu
PPT
Nmlt c09 chuoi_kytu
PPT
Nmlt c11 con_trocoban
PPT
Bai11
PPT
Nmlt c12 quan_lybonho
PPT
Nmlt c03 cac_kieudulieucoso
Local sakainame 501127 ktl_trình hlmt1 a01 fall 2013 _ modules
Bai 11 kieu mang (tiet 1)
Ktlt lab full
Kiểu Mảng 1 chiều
Nmlt c11 con_trocoban-
Nmlt c08 mang2_chieu
bai tap cau truc du lieu ptit
Debug trong c
Stl string
4 matlab ly-thuyet_dohoa_
Nmlt c07 mang1_chieu
Nmlt c09 chuoi_kytu
Nmlt c11 con_trocoban
Bai11
Nmlt c12 quan_lybonho
Nmlt c03 cac_kieudulieucoso
Ad

Viewers also liked (20)

PDF
Security Bootcamp 2013 - Giải pháp phát hiện xâm nhập mạng không dây - WIDS -...
PPT
Wireless
PPT
Ctdl C06
PDF
System hacking_Athena
PPT
Ctdl C08
PPT
Ctdl C11
PPT
Ctdl C10
PPT
Ctdl C09
PDF
Slide báo cáo cuối kì system hacking-Trần Nguyễn Lộc
PDF
Giáo trình cấu trúc dữ liệu và giải thuật của lê minh hoàng
PPT
Ctdl C07
PPT
Ctdl C03
PPT
Gioi Thieu
PPTX
man in the middle
PDF
Bài 4: Bảo mật máy chủ, ứng dụng, dữ liệu và mạng - Giáo trình FPT
DOCX
tìm hiểu các lỗ hổng bảo mật
PDF
Chương 6 Bảo mật - Giáo trình FPT
PPTX
Man In The Middle - Hacking Illustrated
PDF
Bài 5: Quản trị một mạng an toàn và Bảo mật các mạng không dây - Giáo trình FPT
Security Bootcamp 2013 - Giải pháp phát hiện xâm nhập mạng không dây - WIDS -...
Wireless
Ctdl C06
System hacking_Athena
Ctdl C08
Ctdl C11
Ctdl C10
Ctdl C09
Slide báo cáo cuối kì system hacking-Trần Nguyễn Lộc
Giáo trình cấu trúc dữ liệu và giải thuật của lê minh hoàng
Ctdl C07
Ctdl C03
Gioi Thieu
man in the middle
Bài 4: Bảo mật máy chủ, ứng dụng, dữ liệu và mạng - Giáo trình FPT
tìm hiểu các lỗ hổng bảo mật
Chương 6 Bảo mật - Giáo trình FPT
Man In The Middle - Hacking Illustrated
Bài 5: Quản trị một mạng an toàn và Bảo mật các mạng không dây - Giáo trình FPT
Ad

Similar to Ctdl C05 (20)

PPT
Chuong2 de qui
DOC
Baitap ktlt
PDF
Baitap ktlt
PPTX
Bài 05_02_Kỹ thuật lập trình đệ quy.pptx
PPT
Chap6 new
DOCX
Bản tóm tắt cấu trúc dữ liệu và thuật toán
PDF
Tuan1_GioiThieu.pdf
PPT
Giáo trình Phân tích và thiết kế giải thuật - CHAP 6
PPTX
Baigiang - bai4. Bài Toán Và Thuật Toán
PPT
Ctdl+va+gt chuong+1 4
PPT
Ctdl+va+gt chuong+1 4
DOCX
Huong dan 8 o so
PPT
3_Chiavatri.pptdfasfasffafasdfasfasffaasd
PDF
2023_KTLT_TH_01_[ThamKhaoSapXep] Chuong 8 - Mot so ky thuat lap trinh co ban.pdf
DOCX
Bai de quy
PDF
BAI_2_MOT_SO_CHIEN_LUOC_THIET_KE_GIAI_THUAT.pdf
PPT
Giáo trình Phân tích và thiết kế giải thuật - CHAP 4
PDF
Pt04 de qui
DOC
Brief introduction
PDF
Chuong 2 co so phan tich do phuc tap cua giai thuat - sinh vien 2
Chuong2 de qui
Baitap ktlt
Baitap ktlt
Bài 05_02_Kỹ thuật lập trình đệ quy.pptx
Chap6 new
Bản tóm tắt cấu trúc dữ liệu và thuật toán
Tuan1_GioiThieu.pdf
Giáo trình Phân tích và thiết kế giải thuật - CHAP 6
Baigiang - bai4. Bài Toán Và Thuật Toán
Ctdl+va+gt chuong+1 4
Ctdl+va+gt chuong+1 4
Huong dan 8 o so
3_Chiavatri.pptdfasfasffafasdfasfasffaasd
2023_KTLT_TH_01_[ThamKhaoSapXep] Chuong 8 - Mot so ky thuat lap trinh co ban.pdf
Bai de quy
BAI_2_MOT_SO_CHIEN_LUOC_THIET_KE_GIAI_THUAT.pdf
Giáo trình Phân tích và thiết kế giải thuật - CHAP 4
Pt04 de qui
Brief introduction
Chuong 2 co so phan tich do phuc tap cua giai thuat - sinh vien 2

Ctdl C05

  • 1. CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Chương 5: Đệ qui
  • 2. Khái niệm đệ qui Khái niệm (định nghĩa) đệ qui có dùng lại chính nó. Ví dụ: giai thừa của n là 1 nếu n là 0 hoặc là n nhân cho giai thừa của n-1 nếu n > 0 Quá trình đệ qui gồm 2 phần: Trường hợp cơ sở (base case) Trường hợp đệ qui: cố gắng tiến về trường hợp cơ sở Ví dụ trên: Giai thừa của n là 1 nếu n là 0 Giai thừa của n là n * (giai thừa của n-1) nếu n>0
  • 3. Tính giai thừa Định nghĩa không đệ qui: n! = n * (n-1) * … * 1 Định nghĩa đệ qui: n! = 1 nếu n=0 n * (n-1)! nếu n>0 Mã C++: int factorial( int n) { if (n==0) return 1; else return (n * factorial(n - 1)); }
  • 4. Thi hành hàm tính giai thừa 1 1 6 2 n=2 … 2*factorial(1) factorial (2) n=1 … 1*factorial(0) factorial (1) n=0 … return 1; factorial (0) n=3 … 3*factorial(2) factorial (3)
  • 5. Trạng thái hệ thống khi thi hành hàm tính giai thừa factorial(3) factorial(3) factorial(2) factorial(3) factorial(2) factorial(1) factorial(3) factorial(2) factorial(1) factorial(0) factorial(3) factorial(2) factorial(1) factorial(3) factorial(2) factorial(3) t Gọi hàm factorial(3) Gọi hàm factorial(2) Gọi hàm factorial(1) Gọi hàm factorial(0) Trả về từ hàm factorial(0) Trả về từ hàm factorial(1) Trả về từ hàm factorial(2) Trả về từ hàm factorial(3) Stack hệ thống Thời gian hệ thống t
  • 6. Bài toán Tháp Hà nội Luật: Di chuyển mỗi lần một đĩa Không được đặt đĩa lớn lên trên đĩa nhỏ
  • 7. Bài toán Tháp Hà nội – Thiết kế hàm Hàm đệ qui: Chuyển (count-1) đĩa trên đỉnh của cột start sang cột temp Chuyển 1 đĩa (cuối cùng) của cột start sang cột finish Chuyển count-1 đĩa từ cột temp sang cột finish magic
  • 8. Bài toán Tháp Hà nội – Mã C++ void move( int count, int start, int finish, int temp) { if (count > 0) { move(count − 1, start, temp, finish); cout << &quot;Move disk &quot; << count << &quot; from &quot; << start << &quot; to &quot; << finish << &quot;.&quot; << endl; move(count − 1, temp, finish, start); } }
  • 9. Bài toán Tháp Hà nội – Thi hành
  • 10. Bài toán Tháp Hà nội – Cây đệ qui
  • 11. Thiết kế các giải thuật đệ qui Tìm bước chính yếu (bước đệ qui) Tìm qui tắc ngừng Phác thảo giải thuật Dùng câu lệnh if để lựa chọn trường hợp. Kiểm tra điều kiện ngừng Đảm bảo là giải thuật luôn dừng lại. Vẽ cây đệ qui Chiều cao cây ảnh hưởng lượng bộ nhớ cần thiết. Số nút là số lần bước chính yếu được thi hành.
  • 12. Cây thi hành và stack hệ thống Cây thi hành
  • 13. Đệ qui đuôi (tail recursion) Định nghĩa: câu lệnh thực thi cuối cùng là lời gọi đệ qui đến chính nó. Khử: chuyển thành vòng lặp.
  • 14. Khử đệ qui đuôi hàm giai thừa Giải thuật: product=1 for ( int count=1; count < n; count++) product *= count;
  • 15. Dãy số Fibonacci Định nghĩa: F 0 = 0 F 1 = 1 F n = F n-1 + F n-2 khi n>2 Ví dụ: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, … Hàm đệ qui: int fibonacci ( int n) { if (n<=0) return 0; if (n==1) return 1; else return (fibonacci(n-1) + fibonacci(n-2)); }
  • 16. Dãy số Fibonacci – Cây thi hành Đã tính rồi
  • 17. Dãy số Fibonacci – Khử đệ qui Nguyên tắc: Dùng biến lưu trữ giá trị đã tính của F n-2 Dùng biến lưu trữ giá trị đã tính của F n-1 Tính F n = F n-1 + F n-2 và lưu lại để dùng cho lần sau Giải thuật: int Fn2=0, Fn1=1, Fn; for ( int i = 2; i <= n; i++) { Fn = Fn1 + Fn2; Fn2 = Fn1; Fn1 = Fn; }
  • 18. Bài toán 8 con Hậu
  • 19. Bài toán 4 con Hậu
  • 20. Bài toán 8 con Hậu – Giải thuật Algorithm Solve Input trạng thái bàn cờ Output 1. if trạng thái bàn cờ chứa đủ 8 con hậu 1.1. In trạng thái này ra màn hình 2. else 2.1. for mỗi ô trên bàn cờ mà còn an toàn 2.1.1. thêm một con hậu vào ô này 2.1.2. dùng lại giải thuật Solve với trạng thái mới 2.1.3. bỏ con hậu ra khỏi ô này End Solve Vét cạn
  • 21. Bài toán 8 con Hậu – Thiết kế phương thức
  • 22. Bài toán 8 con Hậu – Thiết kế dữ liệu đơn giản const int max_board = 30 ; class Queens { public: Queens( int size) ; bool is_solved( ) const; void print( ) const; bool unguarded( int col) const; void insert( int col) ; void remove( int col) ; int board_size ; // dimension of board = maximum number of queens private: int count ; // current number of queens = first unoccupied row bool queen_square[max_board][max_board] ; } ;
  • 23. Bài toán 8 con Hậu – Mã C++ void Queens :: insert( int col) { queen_square[count++][col] = true; } bool Queens :: unguarded( int col) const { int i ; bool ok = true; for (i = 0 ; ok && i < count ; i++) //kiểm tra tại một cột ok = !queen_square[i][col] ; //kiểm tra trên đường chéo lên for (i = 1 ; ok && count − i >= 0 && col − i >= 0 ; i++) ok = !queen_square[count − i][col − i] ; //kiểm tra trên đường chéo xuống for (i = 1 ; ok && count − i >= 0 && col + i < board_size ; i++) ok = !queen_square[count − i][col + i] ; return ok ; }
  • 24. Bài toán 8 con Hậu – Góc nhìn khác
  • 25. Bài toán 8 con Hậu – Thiết kế mới const int max_board = 30 ; class Queens { public: Queens( int size) ; bool is_solved( ) const; void print( ) const; bool unguarded( int col) const; void insert( int col) ; void remove( int col) ; int board size ; private: int count ; bool col_free[max board] ; bool upward_free[2 * max board − 1] ; bool downward_free[2 * max board − 1] ; int queen_in_row[max board] ; // column number of queen in each row } ;
  • 26. Bài toán 8 con Hậu – Mã C++ mới Queens :: Queens( int size) { board size = size ; count = 0 ; for ( int i = 0 ; i < board_size ; i++) col_free[i] = true; for ( int j = 0 ; j < (2 * board_size − 1) ; j++) upward_free[j] = true; for ( int k = 0 ; k < (2 * board_size − 1) ; k++) downward_free[k] = true; } void Queens :: insert( int col) { queen_in_row[count] = col ; col_free[col] = false; upward_free[count + col] = false; downward_free[count − col + board size − 1] = false; count++ ; }
  • 27. Bài toán 8 con Hậu – Đánh giá Thiết kế đầu Thiết kế mới