1. Trang chủ
  2. » Tất cả

Bài giảng thuật toán ứng dụng đệ quy quay lui nhánh cận trương xuân nam

10 3 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Thuật Toán Ứng Dụng Đệ Quy Quay Lui Nhánh Cận
Tác giả Trương Xuân Nam
Trường học Đại Học Công Nghệ Thông Tin - Đại Học Quốc Gia Hà Nội
Chuyên ngành Khoa Học Máy Tính
Thể loại Bài giảng
Thành phố Hà Nội
Định dạng
Số trang 10
Dung lượng 229,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

THUẬT TOÁN ỨNG DỤNG Đệ quy – Quay lui – Nhánh cận Nội dung 1 Đệ quy ▪ Đệ quy ▪ Đệ quy có nhớ 2 Quay lui ▪ Nhị phân ▪ Tập con ▪ Hoán vị ▪ Phân tích ▪ Đặt hậu 3 Nhánh cận ▪ Bài toán người bán hàng (TSP[.]

Trang 1

THUẬT TOÁN ỨNG DỤNG

Đệ quy – Quay lui – Nhánh cận

Trang 2

Nội dung

1 Đệ quy

▪ Đệ quy

▪ Đệ quy có nhớ

2 Quay lui

▪ Nhị phân

▪ Tập con

▪ Hoán vị

▪ Phân tích

▪ Đặt hậu

3 Nhánh cận

▪ Bài toán người bán hàng (TSP – Traveling Salesman Problem)

Trang 3

Đệ quy

Phần 1

Trang 4

Đệ quy: khái niệm

▪ Hàm đệ quy = Hàm có lợi gọi lại chính nó trong quá trình

thực hiện

▪ Đệ quy trực tiếp: gọi lại chính nó ngay trong thân hàm

▪ Đệ quy gián tiếp: gọi lại chính nó thực hiện trong các hàm con

// in các số nguyên từ 1 đến n viết đệ quy

void print( int n) {

if (n > 1 ) print(n- 1 );

cout << " " << n;

}

// tính tổ hợp chập k của n dựa trên công thức

// C(k, n) = C(k-1, n-1) + C(k, n-1)

int C( int k, int n) {

if (k == n || k == 0 ) return 1 ;

Trang 5

Đệ quy: đặc điểm

▪ Đơn giản:

▪ Đệ quy phù hợp với tiếp cận từ trên xuống (chia bài toán lớn thành các bài toán nhỏ)

▪ Mã ngắn gọn, dễ hiểu, thể hiện chính xác tiếp cận top-down

▪ Chậm:

▪ Chi phí thời gian cho việc gọi hàm đệ quy

▪ Một hàm có thể bị gọi lại nhiều lần

▪ Chuyển về vòng lặp (khử đệ quy): hầu hết các hàm đệ

quy đơn (single recursion – hàm đệ quy chỉ gọi chính nó một lần) đều có thể chuyển về vòng lặp khá đơn giản

▪ Mọi hàm đệ quy đều có thể chuyển về vòng lặp, vấn đề là việc chuyển như vậy đơn giản hay phức tạp mà thôi

Trang 6

Đệ quy có nhớ

▪ Các tiếp cận đệ quy đôi khi làm cho việc gọi hàm con

bùng nổ tổ hợp

int fibo( int n) {

if (n < 2 ) return n;

return fibo(n- 1 ) + fibo(n- 2 );

}

Trang 7

Đệ quy có nhớ

▪ Giải quyết: dùng bộ nhớ lưu lại kết quả để dùng lại

int fibo( int n) {

if (n < 2 ) return n;

// nếu chưa tính hàm fibo(n) thì tính và lưu vào f[n]

if (f[n] = - 1 )

f[n] = fibo(n- 1 ) + fibo(n- 2 );

return f[n];

}

Trang 8

Đệ quy có nhớ: nguyên tắc triển khai

▪ Sử dụng bộ nhớ để lưu kết quả:

▪ Tính toán những trường hợp nhỏ, ghi vào bộ nhớ

▪ Những phần chưa được tính toán thì đánh dấu lại (chẳng hạn như ghi tạm giá trị là -1)

▪ Khi thực hiện đệ quy:

▪ Tìm trong bộ nhớ xem đã có kết quả chưa, nếu có rồi thì trả

ngay về kết quả đã có

▪ Nếu chưa có thì thực hiện đệ quy như bình thường, lưu lại kết quả tính được vào bộ nhớ

▪ Trả về kết quả vừa tính được

▪ Chú ý: không phải lúc nào cũng có thể dùng bộ nhớ để

lưu lại kết quả tính toán

Trang 9

#include <iostream>

const int MAX = 100 ;

int ckn[MAX][MAX];

int C( int k, int n) {

if (k == n || k == 0 ) return 1 ;

if (ckn[k][n] == - 1 )

ckn[k][n] = C(k- 1 , n- 1 ) + C(k, n- 1 );

return ckn[k][n];

}

int main() {

for ( int i = 0 ; i < MAX; i++)

for ( int j = 0 ; j < MAX; j++) ckn[i][j] = - 1 ; std::cout << C( 15 , 30 );

}

Đệ quy có nhớ: ví dụ triển khai

Trang 10

Quay lui

Phần 2

Ngày đăng: 02/03/2023, 07:42

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm