Bài giảng Kỹ thuật lập trình nâng cao - Chương 7: Lập trình đệ quy cung cấp cho người học các kiến thức: Đệ quy tuyến tính, đệ quy nhị phân, đệ quy phi tuyến, đệ quy hỗ tương, các hoạt động hàm đệ quy. Mời các bạn cùng tham khảo nội dung chi tiết.
Trang 1Tr ần Minh Thái
minhthai@itc.edu.vn
*
Trang 2thân của hàm đó có lệnh gọi lại chính nó một
* Phân loại đệqui
2
Trang 3•Trong thân hàm có duy nhất một 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 hàm> 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 một sốcông việc (nếu có)
TenHam (<danh sách tham số>);
//Thực hiện một sốcông việc (nếu có)
Trang 4Ví dụ: Tính
- Điều kiện d ừng: S(0) = 0.
- Qui tắc (công th ức) tính: S(n) = S(n-1) + n.
int TongS (int n)
{
if(n==0)
return 0;
return ( TongS(n-1) + n );
}
n n
4
Trang 5dương
t ố?
kích thước n
Trang 6Trong thân của hàm cóhai 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 hàm> 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 một sốcông việc (nếu có)
.TenHam (<danh sách tham số>); //Giải quyết vấn đềnhỏhơn
//Thực hiện một sốcông việc (nếu có)
TenHam (<danh sách tham số>); //Giải quyết vấn đềcòn lại
//Thực hiện một sốcông việc (nếu có)
Trang 7Ví dụ: Tính sốhạng th ứn của dãy Fibonaci
f1 = f0 =1 ;
Điều kiện d ừng: f(0) = f(1) = 1.
long Fibonaci (int n)
{
if(n==0 || n==1)
return 1;
return Fibonaci(n-1) + Fibonaci(n-2); }
Trang 8*Trong thân của hàm có lời gọi hàm gọi lại chính nó được đặt bên trong vòng lặp.
<Kiểu dữ liệu hàm> TenHam (<danh sách tham số>)
{
for (int i = 1; i<=n; i++)
{ //Th ực hiện một sốcông việc (nếu có)
if (điều kiện d ừng) {
//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ố>);
}
}
}
8
Trang 9Ví dụ: Tính sốhạng thứn của dãy {Xn} được định nghĩa
như sau:
X0 =1 ;
Xn = n2X0 + (n-1)2X1 + … + 12Xn-1 ; (n≥1)
Điều kiện d ừng:X(0) = 1.
long TinhXn (int n)
{
if(n==0)
return 1;
long s = 0;
for (int i=1; i<=n; i++)
s = s + i * i * TinhXn(n-i);
return s;
Trang 10* Trong thân của hàm này có l ời gọi hàm đến hàm kia vàtrong thân của hàm kia có
l ời gọi hàm tới hàm này.
10
Trang 11<Kiểu dữliệu hàm> TenHam2 (<danh sách tham số>);
<Kiểu dữliệu hàm> TenHam1 (<danh sách tham số>)
{
//Thực hiện một sốcông việc (nếu có)
…TenHam2 (<danh sách tham số>);
//Thực hiện một sốcông việc (nếu có)
}
<Kiểu dữliệu hàm> TenHam2 (<danh sách tham số>) {
//Thực hiện một sốcông việc (nếu có)
…TenHam1 (<danh sách tham số>);
//Thực hiện một sốcông việc (nếu có)
}
Trang 12Ví dụ: Tính sốhạng th ứn của hai dãy {Xn}, {Yn} đ ược định nghĩa như sau:
X0 =Y0 =1 ;
Xn = Xn-1 + Yn-1; (n>0)
Yn = n 2 Xn-1 + Yn-1; (n>0)
long TinhYn(int n);
long TinhXn (int n)
{
if(n==0)
return 1;
return TinhXn(n-1) + TinhYn(n-1);
}
long TinhYn (int n)
{
if(n==0)
return 1;
return n*n*TinhXn(n-1) + TinhYn(n-1);
}
12
Trang 13* Ví d ụ tính n! với n=5