Professional Documents
Culture Documents
Bài 4: Đệ quy
Hà Nội, 2022
Nội dung chính của môn học
3. Hàm và mảng
4. Đệ quy
5. Xử lý chuỗi ký tự
Hàm đệ quy
Là công cụ cài đặt bài toán được
định nghĩa đệ quy
Là hàm mà bên trong thân của
hàm đó có lệnh gọi đến chính nó
3
Khái niệm đệ quy
Ví dụ:
Tổng của n số tự nhiên đầu tiên= Tổng của (n-1) số tự nhiên đầu tiên
cộng với n:
S(n) = 1+2+3+...+n thì S(n) = S(n-1) + n
UCLN(a, b) = UCLN(a-b, b) nếu a>b
4
Hoạt động của hàm đệ quy
long Factorial(int n)
{
if (n==1)
return 1;
else
return n*Factorial(n-1);
}
5
Cách dùng đệ quy
6
Ưu nhược điểm của đệ quy
Ưu điểm
Nhiều bài toán được định nghĩa đệ quy rất rõ ràng
Tiếp cận xử lý vấn đề bằng những đoạn code gọn gàng, dễ hiểu
Nhược điểm
Nguy cơ cao tràn bộ nhớ
Khắc phục: khử đệ quy (dùng vòng lặp)
7
So sánh đệ quy và lặp
Đệ quy
Sử dụng cấu trúc lựa chọn
Nhưng trong các lời gọi hàm đệ quy có bao hàm các yếu tố lặp
Liên tục đưa ra các lời gọi hàm nên sẽ tốn bộ nhớ hơn
Trong trường hợp không đủ bộ nhớ lỗi “stack overflow”
Code thường ngắn gọn hơn, nhưng chạy chậm hơn so với dùng lặp
Lặp
Sử dụng các cấu trúc lặp (for, while)
8
Ví dụ
5. Nhập một số nguyên, xác định có phải số nguyên tố? (dùng lặp)
6. Nhập một số nguyên, xác định có phải số nguyên tố? (dùng đệ quy)
9
Các dạng đệ quy
10
Ví dụ (đệ quy cơ bản)
11
Đệ quy nhị phân
Đóng vai trò quan trọng để cài đặt các thuật toán “chia để trị”,
duyệt cây nhị phân...
12
Ví dụ
13
Đệ quy phi tuyến
Việc gọi đệ quy được thực hiện bên trong vòng lặp
14
Ví dụ
Hãy xác định Xn theo công thức truy hồi như sau:
X0 = 1
Xn = n2X0 + (n-1)2X1 + ... + 22Xn-2 + Xn-1 nếu n >= 1
15
Tháp Hà Nội
16
Diễn đạt bài toán dưới dạng đệ quy
17
Cài đặt bài toán Tháp Hà Nội
#include "stdio.h"
void cthap(int m, int x1,int y1, int x2, int y2, int x3, int y3) {
if (m<1) return;
else if(m == 1)
printf("\nChuyen tang 1 tu (%d,%d) den (%d,%d)", x1, y1, x2, y2);
else {
cthap(m-1,x1,y1-1,x3,y3,x2,y2);
printf("Chuyen tang %d tu (%d,%d) den (%d,%d)", m, x1, y1, x2, y2);
cthap(m-1,x3,y3,x2,y2-1,x1,y1);
}
}
int main() {
int m;
printf("\nSo tang: "); scanf("%d",&m);
cthap(m,10,24,30,24,50,24);
}
18
Tóm tắt
Nhị phân
Phi tuyến
19
Bài tập
2. Viết hàm đệ quy tìm số lớn nhất trong một mảng 1 chiều.
4. Viết hàm đệ quy tính ước số chung lớn nhất của hai số nguyên.
20