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

Bài giảng Kỹ thuật lập trình đệ quy

57 19 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

Tiêu đề Bài giảng Kỹ thuật lập trình đệ quy
Trường học Trường Đại Học Công Nghệ Thông Tin
Chuyên ngành Kỹ thuật lập trình
Thể loại Bài giảng
Năm xuất bản 2016
Thành phố Hà Nội
Định dạng
Số trang 57
Dung lượng 814 KB

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

Nội dung

Bài giảng Kỹ thuật lập trình đệ quy gồm có những nội dung chính sau: Giới thiệu về lập trình đệ quy, phân loại các dạng đệ quy, hoạt động của đệ quy, xây dựng giải thuật đệ quy, các giải thuật đệ quy tiêu biểu, các giải pháp thay thế cho đệ quy. Mời các bạn cùng tham khảo.

Trang 2

Giới thiệu về lập trình đệ quy

Phân loại các dạng đệ quy

Hoạt động của đệ quy

Xây dựng giải thuật đệ quy

Các giải thuật đệ quy tiêu biểu

Các giải pháp thay thế cho đệ quy

Tóm tắt chương

Nội dung

Trang 3

Khi lập trình, gặp dạng bài toán: đối tượng khó địnhnghĩa một cách tường minh Kỹ thuật định nghĩa đốitượng qua chính nó: kỹ thuật đệ quy (recursion).

Ví dụ: 2 chiếc gương đối diện nhau Chiếc thứ nhất

chứa hình chiếc thứ hai và ngược lại Ta hình dung radãy các ảnh vô hạn của hai chiếc gương

Ví dụ: trên truyền hình, biên tập viên ngồi kế bênmàn hình của chương trình đang phát, có dãy hìnhảnh lập đi lập lại nhưng nhỏ dần

[3.1] Giới thiệu về lập trình đệ quy

Trang 4

Đệ quy được sử dụng rộng rãi trong khoa học máytính và lý thuyết tính toán.

Định nghĩa theo đệ quy của một khái niệm là địnhnghĩa khái niệm mới thông qua chính khái niệm đangmuốn định nghĩa

Ví dụ: về các định nghĩa đệ quy như sau:

Giai thừa của n (n!):

 Nếu n=0 hoặc n=1 thì n!=1

[3.1] Giới thiệu về lập trình đệ quy

Trang 5

Ký hiệu số phần tử của một hữu hạn S là |S|:

Nếu S= thì |S| = 0

Nếu S≠ thì chắc chắn có một phần tử xS,khi đó |S|=|S\{x}|+1

Đây là phương pháp định nghĩa tập hợp

Trang 6

Cấu trúc danh sách liên kết (linklist/xâu) kiểu T:

Cấu trúc rỗng là danh sách liên kết kiểu T

Kết nối một thành phần kiểu T (nút kiểu T) vàomột danh sách liên kết kiểu T, ta có một danh sáchliên kết kiểu T

[3.1] Giới thiệu về lập trình đệ quy

Trang 7

Ví dụ trên, để định nghĩa đệ quy gồm 2 phần:

Phần cố định (cơ sở - neo – anchor): các trườnghợp suy biến (trường hợp đặc biệt) của thuật toánqua một điều kiện cụ thể (phần dừng của đệ quy –

chương trình phải có tính dừng).

Phần đệ quy (quy nạp): mô tả thuật toán trongtrường hợp phổ biến qua chính đối tượng (gọi hàm

đệ quy) một cách gián tiếp hay trực tiếp

Lưu ý: phần đệ quy phải tiến về phần không đệ quy

[3.1] Giới thiệu về lập trình đệ quy

Trang 9

S, S*: xử lý không đệ quy Có thể gộp bước 2.1 và 2.2 lại.

Bước 1: Nếu thỏa điều kiện dừng thì

thực hiện thao tác S (trả về kết quả) Bước 2: Ngược lại:

Bước 2.1 thực hiện lệnh S*

Bước 2.2 Gọi hàm đệ quy

(cho đối tượng thường là nhỏ hơn)

Đệ quy tuyến tính

Trang 10

Hàm tính giai thừa (n!)

Bước 1: Nếu n=0 hoặc n=1 thì

trả về 1 Bước 2: Ngược lại:

trả về n*Giai_thừa(n-1)

Đệ quy tuyến tính

Trang 12

Uớc chung lớn nhất của 2 số dựa vào thuật toánEuclide:

Bước 1: Nếu n=0 thì

trả về m Bước 2: Ngược lại:

Đệ quy tuyến tính

Trang 14

Tính tổng giá trị của dãy số nguyên

Trang 16

Liệt kê các giá trị lẻ của dãy số nguyên

Bước 1: Nếu n=0 thì

dừng Bước 2: Ngược lại:

Bước 2.1 Nếu a[n-1] lẻ xuất A[n-1] Bước 2.2 gọi hàm lietKeLe(a, n-1)

Đệ quy tuyến tính

Trang 18

Kết quả xuất ra ngược với dãy ban đầu nhập vào.

Xuất xuôi lại ta làm như sau:

Bước 1: Nếu n=0 thì

dừng Bước 2: Ngược lại:

Bước 2.1 gọi hàm lietKeLe(a, n-1) Bước 2.2 Nếu a[n-1] lẻ xuất A[n-1]

Đệ quy tuyến tính

Trang 20

Đối với hàm đệ quy không có trị trả về (void), ta có thể viết theo dạng sau

Bước 1: Nếu chưa dừng (n>0) thì:

Bước 1.1 gọi hàm lietKeLe(a, n-1) Bước 1.2 Nếu a[n-1] lẻ xuất A[n-1]

Đệ quy tuyến tính

Trang 22

Chương trình con gọi trực tiếp đến hàm đệ quy,

thường sẽ có 2 lần gọi hàm đệ quy một cách tường

minh với 2 nhánh rõ ràng

Đệ quy nhị phân

Trang 23

Bước 1: Nếu thỏa điều kiện dừng thì

thực hiện thao tác S (trả về kết quả) Bước 2: Ngược lại:

Trang 24

Viết hàm fiBoNaCi(n) để tính số hạng thứ n của dạyFibonaci.

Bước 1: Nếu n<2 thì

trả về 1 Bước 2: Ngược lại:

trả về fiBo(n-1)+fiBo(n-2)

Đệ quy nhị phân

Trang 26

Tìm kiếm nhị phân trên dãy đã được sắp tăng.

Bước 1: Nếu left>right trả về -1

Trang 27

Cài đặt:

int timNhiPhan(int []a,int left, int right,int X)

{ if (left > right) return -1;

int mid = (left + right) / 2;

if (a[mid] == X) return mid;

if (a[mid] < X) return timNhiPhan(a, mid +1,right,X);

return timNhiPhan(a,left,mid-1,X);

}

Đệ quy nhị phân

Trang 28

Đệ quy trực tiếp, gọi đệ quy trong vòng lặp.

Vòng lặp for từ giá trị đầu đến giá trị cuối

Trang 29

Hoặc có dạng:

B1: Nếu thỏa điều kiện dừng thì

Thực hiện lệnh S B2: Ngược lại:

Trang 30

Ta có công thức truy hồi tính dãy {Xn} như sau:

X0 = 1

Xn = n2X0 +(n-1)2X1+ +22Xn-2 = 12Xn-1

Đệ quy phi tuyến

Trang 31

int tinhX(int n)

{ if (n == 0) return 1;

else { int tong = 0;

for (int i = 0; i < n; i++)tong += (n - i) * (n - i) * tinhX(i);

return tong;

}}

Đệ quy phi tuyến

Trang 32

Trong thân hàm này có lời gọi hàm đến hàm kia vàtrong thân hàm kia có lời gọi hàm tới hàm này.

Trang 33

Hàm thứ hai B1: Nếu thỏa đk dừng thì

Thực hiện lệnh S*

Thực hiện lệnh S Gọi ĐQ hàm nhất

Đệ quy hỗ tương

Trang 34

Tính số hạng thứ n của hai dãy {Xn}, {Yn} được địnhnghĩa như sau:

Trang 36

Gồm 2 pha:

Pha tiến (forward): Tiến đến lời giải nhỏ nhất

Pha lùi (backward): Kết hợp các kết quả lại vớinhau

[3.3] Hoạt động của đệ quy

Trang 37

Main( ) Gọi Giai thừa 5

Giai Thừa ( 5 ) Gọi Giai thừa 4

Giai Thừa ( 4 ) Gọi Giai thừa 3

Giai Thừa ( 3 ) Gọi Giai thừa 2

Giai Thừa ( 2 ) Gọi Giai thừa 1

Trang 38

F0=1 F1=1

F1=1 F2=F1+F0

F2=F1+F0 F3=F2+F1

Trang 39

F0=1 F1=1

F0=1 F1=1

F1=1 F2=F1+F0

F2=F1+F0 F3=F2+F1

kq=1 kq=1

kq=1 kq=2 kq=1 kq=1

kq=2 kq=3

kq=5

Trang 40

Bước 1: Thông số hóa bài toán.

Bước 2: Phát hiện các trường hợp suy biến (đặc biệt,

dừng, neo) và tìm giải thuật cho bài toán này

Bước 3: Phân rã bài toán theo hướng đệ quy.

[3.4] Xây dựng giải thuật đệ quy

Trang 41

Tổng quát hóa bài toán, tìm ra nhóm các bài toán, cácthông số kích thước, thông số điều khiển.

Ví dụ: thông số n trong hàm tính giai thừa, trong hàmFibonaci, thông số a,b trong hàm tìm ước số chunglớn nhất

Bước 1: Thông số hóa bài toán

Trang 42

Là các trường hợp tương ứng với giá trị biên của biếnđiều khiển (trường hợp kích thước nhỏ nhất, trườnghợp đặc biệt) mà giải thuật không đệ quy giải rất đơgiản.

Trang 43

Tìm giải thuật trong trường hợp tổng quát bằng cáchphân rã thành các thành phần nhỏ hơn không đệ quyhoặc là bài toán đệ quy nhưng với kích thước nhỏhơn.

Bước 3: Phân rã theo hướng đệ quy

Trang 44

B1: Thông hóa hóa bài toán:

Xét ở mức tổng quát: chuyển n (n>0) đĩa từ cột Asang cột C với cột B làm trung gian

Ta gọi hàm có tên thapHaNoi(n,A,B,C) với bốn

tham số, trong đó thông số n là thông số thay đổi,

ta gọi n là thông số điều khiển

Bài toán tháp hà nội

Trang 45

B2: Trường hợp suy biến và giải thuật:

Với n=1 bài toán tổng quát suy biến thành bài toánđơn giản thapHaNoi(1,A,B,C), lúc này chỉ cầnchuyển 1 đĩa từ cột A sang cột C là xong (trong đó

B là cột trung gian), ta có thao tácchuyenDia(A,C)

Bài toán tháp hà nội

Trang 46

B3: Phân rã bài toán:

Muốn n đĩa từ cột A sang cột C, với cột B là cột trunggian thapHaNoi, ta thực hiện 3 công việc sau:

Chuyển (n-1) đĩa từ cột A sang cột B, lấy C làmtrung gian: thapHaNoi(n-1,A,C,B)

Chuyển 1 đĩa từ cột A sang cột C: chuyenDia(A,C)thao tác không đệ quy

Chuyển (n-1) đĩa từ cột B sang cột C, lấy A làm

Bài toán tháp hà nội

Trang 47

Ta có giải thuật sau: thapHaNoi(n,A,B,C).

Bước 1: Nếu chưa dừng (n>1) thì

Bước 1.1 thapHaNoi(n-1,A,C,B) Bước 1.2 chuyenDia(A,C)

Bước 1.3 thapHaNoi(n-1,B,A,C)

Bài toán tháp hà nội

Trang 48

void chuyenDia(char A, char C)

}

int main()

Trang 51

tính số hạng thứ n của dãy fibonaci.

Trang 52

Một hàm được gọi có tính đệ qui nếu trong thân củahàm đó có lệnh gọi lại chính nó một cách tường minhhay 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

Tóm tắt chương

Trang 53

Hoạt động đệ quy gồm 2 pha: pha tiến và pha lùi.

Ta có ba bước để xây dựng giải thuật đệ quy:

Trang 54

Có một số giải thuật đệ quy tiêu biểu như: quay lui,nhánh cận và chia để trị.

Ta có thể dùng các giải pháp thay thế cho đệ quy như:

Dùng công thức tường minh, vòng lặp.

Dùng mảng 1 chiều, 2 chiều

Dùng Stack

Tóm tắt chương

Trang 55

Tính n!

In ra các ước số của số nguyên dương

Đếm số lượng ước số của số nguyên dương

Tìm ước số chung lớn nhất của 2 số nguyên dương

Kiểm tra số nguyên dương n có phải là số nguyên tố?

Nhập vào mảng 1 chiều số nguyên a, kích thước n

Xuất mảng 1 chiều số nguyên a, kích thước n

Bài tập

Trang 56

Tìm phần tử có giá trị x trong mảng số nguyên a, kíchthước n

Viết hàm đệ quy tính tổ hợp chập k của n

Viết hàm đệ quy In mảng a gồm n phần tử (n≤100)lên màn hình

Viết hàm đệ quy In ra các chữ số của số nguyên ntheo thứ tự đảo ngược

Viết hàm đệ quy Tìm số lớn nhất /nhỏ nhất của mảng

Bài tập

Trang 57

Viết hàm đệ quy Đếm số lần xuất hiện của ký tự ch trongchuỗi s

Viết hàm đệ quy Kiểm tra n có phải là số nguyên tố không

Viết hàm đệ quy Giải bài toán tháp Hanoi

Viết hàm đệ quy liệt kê các phân số tối giản không giảmnằm trong [0, 1] và có mẫu số nhỏ hơn hay bằng n

Viết hàm đệ quy Tính giá trị của một số viết dưới dạng chữ

LA MÃ

Viết hàm đệ quy cho bài toán mã đi tuần

Bài tập

Ngày đăng: 11/05/2021, 03:08

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

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

w