Đệ quy
Phạm Thi Vương
6/27/14 Nhập môn CTDL và Thuật toán 2
Ñeä quy?
•
Một khái niệm X gọi là định nghĩa theo đệ qui nếu trong chính định
nghĩa X có sử dụng khái niệm X
Ví dụ:
1. Định nghĩa Số tự nhiên:
0 là một số tự nhiên
n > 0 là số tự nhiên nếu n – 1 là số tự nhiên
2. Định nghĩa n giai thừa
0! = 1
Nếu n >0 thì n! = n* (n-1)!
6/27/14 Nhập mơn CTDL và Thuật tốn 3
Đệ quy?
•
Đưa bài toán hiện tại về một bài toán cùng loại, cùng tính chất (đồng dạng)
nhưng ở cấp độ thấp hơn, quá trình này tiếp tục cho đến khi bài toán đưa về
cấp độ có thể giải được.
•
Đệ quy là kỹ thuật giải quyết vấn đề bằng cách giải quyết vấn đề nhỏ hơn
cùng loại.
6/27/14 Nhập môn CTDL và Thuật toán 4
Ví dụ
1 if n = 0
n!=
(n-1)!*n if n > 0
1 if n = 0
n!=
1*2*3*…*(n-1)*n if n > 0
•
Định nghĩa số Số tự nhiên
- 0 là một số tự nhiên.
- n là số tự nhiên nếu n - 1 là số tự nhiên.
6/27/14 Nhập môn CTDL và Thuật toán 5
Cấu trúc chương trình
Chương trình đệ qui gồm hai phần chính:
1. Phần cơ sở: Điều kiện thoát khỏi đệ qui
2. Phần đệ quy: Trong phần thân chương trình có lời gọi đến chính bản thân
chương trình với giá trị mới của tham số nhỏ hơn giá trị ban đầu
6/27/14 Nhập môn CTDL và Thuật toán 6
Tính giai thöøa
int Fact(int n)
{
if (n==0) // c sơ ở
return 1;
else
return n * Fact (n-1);
}
6/27/14 Nhập môn CTDL và Thuật toán 7
Minh họa
Gọi hàm answer <- Fact(5)
CT chính: Chưa xong: answer <- Fact (5)
6/27/14 Nhập môn CTDL và Thuật toán 8
Minh họa
CT chính: Chưa xong: answer <- Fact (5)
Fact. 1st: N=5, Chưa xong: 5*Fact(4)
6/27/14 Nhập môn CTDL và Thuật toán 9
Minh họa
CT chính: Chưa xong: answer <- Fact (5)
Fact. 1st: N=5, Chưa xong: 5*Fact(4)
Fact. 2nd: N=4, Chưa xong: 4*Fact(3)
6/27/14 Nhập môn CTDL và Thuật toán 10
Minh họa
CT chính: Chưa xong: answer <- Fact (5)
Fact. 1st: N=5, Chưa xong: 5*Fact(4)
Fact. 2nd: N=4, Chưa xong: 4*Fact(3)
Fact. 3rd: N=3, Chưa xong: 3*Fact(2)
6/27/14 Nhập môn CTDL và Thuật toán 11
Minh họa
CT chính: Chưa xong: answer <- Fact (5)
Fact. 1st: N=5, Chưa xong: 5*Fact(4)
Fact. 2nd: N=4, Chưa xong: 4*Fact(3)
Fact. 3rd: N=3, Chưa xong: 3*Fact(2)
Fact. 4th: N=2, Chưa xong: 2*Fact(1)
6/27/14 Nhập môn CTDL và Thuật toán 12
Minh họa
CT chính: Chưa xong: answer <- Fact (5)
Fact. 1st: N=5, Chưa xong: 5*Fact(4)
Fact. 2nd: N=4, Chưa xong: 4*Fact(3)
Fact. 3rd: N=3, Chưa xong: 3*Fact(2)
Fact. 4th: N=2, Chưa xong: 2*Fact(1)
Fact. 5th: N=1, Chưa xong: 1*Fact(0)
6/27/14 Nhập môn CTDL và Thuật toán 13
Minh họa
CT chính: Chưa xong: answer <- Fact (5)
Fact. 1st: N=5, Chưa xong: 5*Fact(4)
Fact. 2nd: N=4, Chưa xong: 4*Fact(3)
Fact. 3rd: N=3, Chưa xong: 3*Fact(2)
Fact. 4th: N=2, Chưa xong: 2*Fact(1)
Fact. 5th: N=1, Chưa xong: 1*Fact(0)
Fact. 6th: N=0, xong: returns 1
6/27/14 Nhập môn CTDL và Thuật toán 14
Minh họa
CT chính: Chưa xong: answer <- Fact (5)
Fact. 1st: N=5, Chưa xong: 5*Fact(4)
Fact. 2nd: N=4, Chưa xong: 4*Fact(3)
Fact. 3rd: N=3, Chưa xong: 3*Fact(2)
Fact. 4th: N=2, Chưa xong: 2*Fact(1)
Fact. 5th: N=1, xong: returns 1*1
6/27/14 Nhập môn CTDL và Thuật toán 15
Minh họa
CT chính: Chưa xong: answer <- Fact (5)
Fact. 1st: N=5, Chưa xong: 5*Fact(4)
Fact. 2nd: N=4, Chưa xong: 4*Fact(3)
Fact. 3rd: N=3, Chưa xong: 3*Fact(2)
Fact. 4th: N=2, xong: returns 2*1
6/27/14 Nhập môn CTDL và Thuật toán 16
Minh họa
CT chính: Chưa xong: answer <- Fact (5)
Fact. 1st: N=5, Chưa xong: 5*Fact(4)
Fact. 2nd: N=4, Chưa xong: 4*Fact(3)
Fact. 3rd: N=3, xong: returns 3*2
6/27/14 Nhập môn CTDL và Thuật toán 17
Minh họa
CT chính: Chưa xong: answer <- Fact (5)
Fact. 1st: N=5, Chưa xong: 5*Fact(4)
Fact. 2nd: N=4, xong: returns 4*6
6/27/14 Nhập môn CTDL và Thuật toán 18
Minh họa
CT chính: Chưa xong: answer <- Fact (5)
Fact. 1st: N=5, xong: returns 5*24
6/27/14 Nhập môn CTDL và Thuật toán 19
Minh họa
CT chính: xong: answer <- 120
6/27/14 Nhập mơn CTDL và Thuật tốn 20
Tính giai thừa không đệ quy
•
Dùng vòng lặp
int Fact (int n)
{
int fact = 1;
for(int count = 2; count <= n; count++)
fact = fact * count;
return fact;
}
6/27/14 Nhập môn CTDL và Thuật toán 21
Luõy thöøa
6/27/14 Nhập môn CTDL và Thuật toán 22
Luõy thöøa
•
Tính x
p
•
Giả sử p > 0
•
Không dùng đệ quy:
long power (int x, int p)
{
long result = x;
for (int i=1; i<p; i++)
result *= x;
return result;
}
6/27/14 Nhập môn CTDL và Thuật toán 23
Luõy thöøa
•
x
p
= x * x
p-1
long Power(int x, int p)
{
if (p == 1)
return x;
else
return x * Power (x, p - 1);
}
6/27/14 Nhập môn CTDL và Thuật toán 24
Activations Stack Example
Algo: total <- Power(3,4)
Power base = 3 exp = 4 3 *Power(3,3)
Power base = 3 exp = 3 3 *Power(3,2)
Power base = 3 exp = 2 3 *Power(3,1)
Power base = 3 exp = 1 3 *Power(3,0)
Power base = 3 exp = 0 xong: 1
Total <- 81
1
3
9
27
1
3
9
27
81
6/27/14 Nhập môn CTDL và Thuật toán 25
Luõy thöøa
•
Chú ý x
p
= x
p/2
* x
p/2
nếu p chẵn
x
p
= x
p/2
* x
p/2
* x nếu p lẻ
long powerR2 (int x, int p)
{
if (p == 1) return x;
else {
long z = powerR2 (x, p / 2);
if (p % 2 == 0) return z * z;
return z * z * x;
}
}