Chương 1 trang bị cho người học kiến thức cơ bản về lập trình đệ quy. Nội dung chính trong chương này gồm có: Khái niệm, thiết kế giải thuật đệ quy, cấu trúc hàm đệ quy, phân loại đệ quy, đệ quy tuyến tính, đệ quy nhị phân, đệ quy hỗ tương,... Mời các bạn cùng tham khảo.
Trang 1Võ Quang Hoàng Khang
Trang 2 Cho S(n) = 1 + 2 + 3 + … + n
=>S(10)? S(11)?
Trang 4 Một hàm được gọi có tính đệ quy nếu trong thân của hàm đó có lệnh gọi lại chính nó.
Trang 5 B1 Tham số hoá bài toán.
dạng bài toán cùng loại nhưng có phạm vi giảiquyết nhỏ hơn theo nghĩa dần tiến đến trường hợpsuy biến
Trang 6Hàm đệ quy gồm 2 phần:
(điểm dừng)
của tham số nhỏ hơn giá trị ban đầu
1)!
(n
-*
n
!
n
Trang 7* 1)!
-(n
!
n
Trang 8void NhapMang(int a[],int n)
Trang 10//Trả về giá trị hay kết thúc công việc }
//Thực hiện các công việc (nếu có)
TenHam (<danh sách tham số>);
//Thực hiện các công việc (nếu có)
}
Trang 11Ví dụ 1: Tính
Điều kiện dừng: S(0) = 0.
Công thức truy hồi: S(n) = S(n-1) + n.
int TongS (int n)
S( ) 1 2 3
Trang 121 2
6 24
120
GiaiThua(2) GiaiThua(4) GiaiThua(3)
1 n GiaiThua(1)
Trang 13Trong thân hàm có 2 lời gọi hàm gọi lại chính nó một cách tường minh.
<Kiểu dữ liệu > TenHam (<danh sách tham số>)
{
if (điều kiện dừng) {
//Trả về giá trị hay kết thúc công việc }
//Thực hiện các công việc (nếu có)
TenHam (<danh sách tham số>);
//Thực hiện các công việc (nếu có)
TenHam (<danh sách tham số>);
//Thực hiện các công việc (nếu có)
}
Trang 15//Trả về giá trị hay kết thúc công việc }
else {
//Thực hiện một số công việc (nếu có)
TenHam (<danh sách tham số>);
} }
Trang 17Trong thân của hàm này có lời gọi hàm đến hàm kia vàngược lại.
g()
f()
h() f()
Trang 18<Kiểu dữ liệu > TenHam2 (<các tham số>);
<Kiểu dữ liệu > TenHam1 (<các tham số>)
{
//Thực hiện một số công việc (nếu có)
…TenHam2 (<các tham số>);
//Thực hiện một số công việc (nếu có)
}
<Kiểu dữ liệu > TenHam2 (<các tham số>)
{
//Thực hiện một số công việc (nếu có)
…TenHam1 (<các tham số>);
//Thực hiện một số công việc (nếu có)
}
Trang 20 Thay vì sử dụng lời giải đệ quy cho một bài toán, ta có thể thay thế bằng lời giải không đệ quy (khử đệ quy) bằng
phương pháp lặp
Ưu và khuyết điểm của đệ quy:
Trong lập trình HẠN CHẾ viết hàm đệ quy nếu thấy không cần thiết
Thuận lợi cho việc biểu diễn
bài toán
Gọn (đối với chương trình)
Có khi không được tối ưu về thời gian
Có thể gây tốn bộ nhớ
20
Trang 21Ví dụ 1: Vi trùng cứ 1 giờ lại nhân đôi Vậy sau 5 giờ sẽ cómấy con vi trùng nếu ban đầu có 2 con?
*Giải pháp: Gọi Vh là số vi trùng tại thời điểm h
Trang 22Ví dụ 2: Gửi ngân hàng 1000 USD, lãi suất 12%/năm.
Số tiền có được sau 30 năm là bao nhiêu?
Trang 23Ví dụ 3: Bài toán tháp Hà Nội
Chuyển một chồng n đĩa với kích thước khác nhau từ cột A sang cột C theo nguyên tắc:
Mỗi lần chỉ chuyển 1 đĩa.
Không được đặt đĩa lớn trên
đĩa nhỏ.
Có thể dùng cột B làm cột
trung gian B
Trang 24* Tham số hoá bài toán: HaNoi (n, A, B, C)
Trong đó: n: Số đĩa
A: Cọc nguồnB: Cọc trung gianC: Cọc đích
(A, B, C có kiểu ký tự)
24
Trang 25Giải thuật đệ quy bài toán Tháp Hà Nội:
Nếu n = 1 thì chuyển đĩa từ A qua C
Thử với n=2 : + Chuyển đĩa thứ nhất từ A sang B
+ Chuyển đĩa thứ hai từ A sang C + Chuyển đĩa thứ nhất từ B sang C
Trang 26A B C
1 đĩa
Trang 27A B C
1 đĩa
Trang 28A B C
2 đĩa
Trang 29A B C
2 đĩa
Trang 30A B C
2 đĩa
Trang 31A B C
2 đĩa
Trang 32A B C
N đĩa
Trang 33A B C
N đĩa
Trang 34A B C
N đĩa
Trang 35Giải thuật đệ quy bài toán Tháp Hà Nội:
void HaNoi (int n, char A, char B, char C) {
if (n==1)
cout<<A<<“”<< C;
else {
HaNoi(n-1, A, C, B);
HaNoi(1, A, B, C);
HaNoi(n-1, B, A, C);
} }
Trang 36Bài tập 1: Viết hàm đệ quy biểu diễn nhị phân của 1 số nguyên n Ví dụ: n=13 1101
36
Xuất dạng nhị phân của n:
- Nếu (n/2 > 0) thì xuất dạng nhị phân của n/2;
Trang 37Bài tập 2: Chuyển số giây thành giờ, phút, giây.
m=n/60;
DoiGio(n%60, h, m, s);
} }
Trang 38Bài tập 3: Tính tổng các chữ số của một số nguyên n.
Trang 39Bài tập 4: Xuất ngược các chữ số của số nguyên n.
Trang 40Bài tập 5: Viết hàm đệ quy in đảo ngược chuỗi X
- Trường hợp chung: + In ký tự cuối cùng của chuỗi X.
+ Lấy phần chuỗi còn lại.
- Trường hợp suy biến: Nếu chuỗi rỗng thì không làm gì cả.
Trang 41Bài tập 6: Viết hàm đệ quy kiểm tra xem một số có phải số nguyên tố không
Trang 42Bài tập 7: In hình tam giác sau bằng cách đệ quy
42
void InSao(int n){
Trang 43Bài tập 8: Cho mảng a có n phần tử, tính tổng các phần tửtrong mảng bằng đệ quy
Điều kiện dừng: nếu n=0 thì sum(a,n)=0
Giải thuật chung: sum (a,n) = a[n-1] + sum(a, n-1), n>0
Trang 44Bài tập 9: Cho mảng a có n phần tử, tìm giá trị lớn nhấttrong mảng bằng đệ quy
44
Điều kiện dừng: Mảng 1 phần tử thì trị lớn nhất là a[0]
Giải thuật chung:
Max (a,n) = a[0] , n=1
a[n-1] > Max(a, n-1)? a[n-1] : Max(a,n-1), n>1
Trang 451. Viết hàm đệ quy tính: xn
2. Viết hàm đệ quy đếm số lần xuất hiện của kí tự ch trong
chuỗi S
3. Viết hàm đệ quy tính giá trị phần tử thứ k của dãy số
sau: 1 2 3 6 11 20 37 68 125 … Sau đó viếtchương trình in ra màn hình n số của dãy số trên
Trang 46viết chương trình in ra màn hình n số hạng của dãy.
dương.
nhập 3665 -> 1: 1: 5 giây
Trang 479. Viết hàm đệ quy xuất ngược các chữ số của số nguyên n.