Professional Documents
Culture Documents
W2 Recursion
W2 Recursion
ĐỆ QUY
1
Mục tiêu
vietanh@vnu.edu.vn 2
ĐỆ QUI
1. Khái niệm
2. Cấu trúc chương trình
3. Nguyên lý hoạt động
4. Ưu và nhược điểm
5. Bài toán minh hoạ
1. Tính N!
2. Tìm số hạng thứ n của dãy Fibonacci
3. Bài toán tháp Hà Nội
6. Khử đệ qui
vietanh@vnu.edu.vn 3
Khái niệm
vietanh@vnu.edu.vn 5
Cấu trúc chương trình( tiếp…)
Chươngtrình A(x) {
If (điều kiện thoát đệ qui)
Kết thúc đệ qui;
….
ChươngtrìnhA(x’);
….
}
Với x’ < x
vietanh@vnu.edu.vn 6
Bài toán tính n!
▪ Input:
N (là số tự nhiên)
▪ Output:
N!
vietanh@vnu.edu.vn 7
Bài toán tính N!(tiếp…)
vietanh@vnu.edu.vn 8
Bài toán tính N!(tiếp…)
▪ GiaiThừa(n)
Bước 1: Nếu n = 0 thì GiaiThừa =1,
ngược lại
GiaiThừa = n*GiaiThừa(n-1)
vietanh@vnu.edu.vn 9
Bài toán tính N!(tiếp…)
vietanh@vnu.edu.vn 10
Nguyên lý hoạt động
GIAITHUA(0) GIAITHUA(0)
GIAITHUA(1) GIAITHUA(1)
GIAITHUA(1)
GIAITHUA(2) GIAITHUA(2)
GIAITHUA(2)
GIAITHUA(3) GIAITHUA(3)
GIAITHUA(3)
GIAITHUA(4) GIAITHUA(4)
GIAITHUA(4)
GIAITHUA(5) GIAITHUA(5)
GIAITHUA(5)
vietanh@vnu.edu.vn 11
Ưu điểm
vietanh@vnu.edu.vn 12
Nhược điểm
vietanh@vnu.edu.vn 13
Bài toán tìm số hạng thứ n của dãy
Fibonacci
▪ Số hạng thứ n của dãy fibonacci được
định nghĩa:
▪ F0 = 1
▪ F1 = 1
▪ Fn =Fn-1 + Fn-2
▪ Ví dụ:
▪ 1,1,2,3,5,8,13,21,34,55,…. là dãy
fibonacci
vietanh@vnu.edu.vn 14
Bài toán tìm số hạng thứ n của dãy
Fibonacci (tiếp…)
▪ Input
Cho n là số tự nhiên
▪ Output
Tính số hạng thứ n của dãy fibonacci
vietanh@vnu.edu.vn 15
Bài toán tìm số hạng thứ n của dãy
Fibonacci (tiếp…)
▪ Điều kiện thoát khỏi đệ qui
N<=1
▪ Đệ qui
Fn = F n-1 +F n-2
vietanh@vnu.edu.vn 16
Bài toán tìm số hạng thứ n của dãy
Fibonacci (tiếp…)
Fibonacci(n)
1. Nếu n<=1 thì Fibonacci =1 ngược lại
2. F(n) = F(n-1) +F(n-2)
vietanh@vnu.edu.vn 17
Bài toán tìm số hạng thứ n của dãy
Fibonacci (tiếp…)
vietanh@vnu.edu.vn 18
Bài toán tháp Hà nội
▪ Có 2 cột A,B
▪ Tại cột A người ta xếp n đĩa kích thước khác nhau, đĩa lớn ở dưới,
đĩa nhỏ ở trên.
▪ Yêu cầu hãy chuyển các đĩa từ cột A sang B sao cho:
▪ Mỗi lần chỉ được chuyển 1 đĩa
▪ Ở các cột, đĩa lớn luôn ở dưới, đĩa nhỏ ở
trên
vietanh@vnu.edu.vn 19
Bài toán Tháp Hà Nội
B
A
vietanh@vnu.edu.vn 20
Bài toán Tháp Hà Nội
A C B
vietanh@vnu.edu.vn 21
Bài toán Tháp Hà Nội
A C B
vietanh@vnu.edu.vn 22
Bài toán Tháp Hà Nội
A C B
vietanh@vnu.edu.vn 23
Bài toán Tháp Hà Nội
A C B
vietanh@vnu.edu.vn 24
Bài toán Tháp Hà Nội
A C B
vietanh@vnu.edu.vn 25
Bài toán Tháp Hà Nội
A C B
vietanh@vnu.edu.vn 26
Bài toán Tháp Hà Nội
A C B
vietanh@vnu.edu.vn 27
Bài toán Tháp Hà Nội
A C B
vietanh@vnu.edu.vn 28
Bài toán tháp Hà nội - Thuật toán
vietanh@vnu.edu.vn 29
Bài toán tháp Hà nội - Thuật toán
(tiếp…)
▪ ChuyểnĐĩa(n,A,B,C) {Chuyển n đĩa từ cột A sang cột B, sử dụng cột
trung gian C - chuyển n-1 đĩa từ A sang C}
▪ ChuyểnĐĩa(n-1,A,B,C)
▪ Chuyển1Đĩa(A,B)
▪ ChuyểnĐĩa(n-1,C,B,A)
vietanh@vnu.edu.vn 30
Bài toán tháp Hà nội - Thuật toán
(tiếp…)
vietanh@vnu.edu.vn 31
Khử đệ qui
▪ Thay thế lời gọi đệ qui trong chưong trình bằng các lệnh
khác để giải quyết bài toán.
▪ VD: Khử đệ qui bài tính n!
function GiaiThua(n: integer): integer;
Var T,i:integer;
Begin
T=1;
if (n>0) then
for i=0 to n do T = T*i;
GiaiThua =T;
End;
vietanh@vnu.edu.vn 32
Khử đệ qui (tiếp…)
vietanh@vnu.edu.vn 33
Bài tập
vietanh@vnu.edu.vn 34
Tổng kết
vietanh@vnu.edu.vn 35
Tiếp theo…
vietanh@vnu.edu.vn 36