You are on page 1of 14

Đệ quy - Recursion

1. Lý thuyết

2. Code mẫu

3. Bài tập

07/04/2008 Cao Thái Phương Thanh, khoa Công nghệ Thông tin, ĐH Sài Gòn 1
Định nghĩa đệ quy

• Định nghĩa đệ quy: định nghĩa trường hợp đơn giản


và quy tắc để đưa trường hợp phức tạp về trường
hợp đơn giản.
Ví dụ 1: định nghĩa số tự nhiên (nguyên dương)
 0 là một số tự nhiên.
 n là số tự nhiên nếu (n – 1) là số tự nhiên.

Ví dụ 2: định nghĩa giai thừa: n! (n là số tự nhiên)


 0! = 1
 n! = n * ( (n-1)! )
07/04/2008 Cao Thái Phương Thanh, khoa Công nghệ Thông tin, ĐH Sài Gòn 2
Định nghĩa đệ quy
Ví dụ 3: định nghĩa số lẻ

Ví dụ 4: định nghĩa lũy thừa x^n (n là số tự nhiên)



Các ví dụ ngoài toán học …

07/04/2008 Cao Thái Phương Thanh, khoa Công nghệ Thông tin, ĐH Sài Gòn 3
Thuật toán đệ quy

• Thuật toán đệ quy: chia nhỏ bài toán thành các bài
toán giống hệt cho đến khi bài toán nhỏ giải quyết
dễ dàng hoặc không thể chia nhỏ được nữa.

• Trong tin học, hàm đệ quy: hàm gọi chính nó (với


tham số khác nhau) và có ít nhất một điều kiện để
không gọi tiếp.
Thuật toán đệ quy là thuận toán có sử dụng hàm đệ
quy.
07/04/2008 Cao Thái Phương Thanh, khoa Công nghệ Thông tin, ĐH Sài Gòn 4
Thuật toán đệ quy
• Ví dụ 1: tính giai thừa: n! (n là số tự nhiên)
 0! = 1
 n! = n * ( (n-1)! )

• Ví dụ 2: tìm ước số chung lớn nhất của 2 số nguyên a, b


If (a == 0) then USCLN(a, b) = b
Else USCLN(a, b) = USCLN( (b % a) , a)

07/04/2008 Cao Thái Phương Thanh, khoa Công nghệ Thông tin, ĐH Sài Gòn 5
Thuật toán đệ quy
• Ví dụ 3: dãy số Fibonancci

• Ví dụ 4: binary search

1 2 4 5 6 8 12 15
?
15
07/04/2008 Cao Thái Phương Thanh, khoa Công nghệ Thông tin, ĐH Sài Gòn 6
Code mẫu

long giaithua(int n)
{
\\ điều kiện dừng
if (n == 0)
{
return (1);
}

return (n * giaithua(n – 1));


}

07/04/2008 Cao Thái Phương Thanh, khoa Công nghệ Thông tin, ĐH Sài Gòn 7
Code mẫu
void printnum ( int begin )
{
printf(" %d ", begin);
if ( begin < 9 )
{
printnum ( begin + 1 );
}
printf(" %d ", begin);
}

printnum(5); 

Thay đổi điều kiện (begin < 9) thì thế nào ?

07/04/2008 Cao Thái Phương Thanh, khoa Công nghệ Thông tin, ĐH Sài Gòn 8
Code mẫu

// loop version
int BinarySearch(int a[], int N, int x)
{
int mid, left = 0, right = N–1;
do
{
mid = (left + right) / 2;
if(x == a[mid])
return mid;
else if (x > a[mid])
left = mid + 1;
else
right = mid – 1;
}
while (left <= right)
return -1;
}

07/04/2008 Cao Thái Phương Thanh, khoa Công nghệ Thông tin, ĐH Sài Gòn 9
Code mẫu
\\ recursive version
int binarysearch(int A[],int x,int left,int right)
{
int mid = (left + right)/2;
if(x > A[mid] && left < mid)
return(binarysearch(A,x,mid+1,right);
else if(x < A[mid] && right > mid)
return(binarysearch(A,x,left,mid–1);
else if(x == A[mid])
return(mid);
return(–1);
}

07/04/2008 Cao Thái Phương Thanh, khoa Công nghệ Thông tin, ĐH Sài Gòn 10
Bài tập

int f(int x) //x is nonnegative


{
if (x == 0)
return (x + 1);
return 1 + f(x-1);
}
Find f(3)

07/04/2008 Cao Thái Phương Thanh, khoa Công nghệ Thông tin, ĐH Sài Gòn 11
int f(int x)
{
   if (x > 5)
      return f(f(x - 2) - 1) + x;
   if (0 < x && x <=5)
      return f(f(x - 1) -2) + 2;
   return x;
}
Find f(9).

07/04/2008 Cao Thái Phương Thanh, khoa Công nghệ Thông tin, ĐH Sài Gòn 12
Bài tập
1. Viết lại các hàm đã trình bày trong phần code mẫu: tính giai
thừa, in số, tìm kiếm nhị phân (không đệ quy và đệ quy).
2. Viết hàm tìm ước số chung lớn nhất của 2 số nguyên.
3. Viết hàm in ra dãy số Fibonancci từ 1 tới n (n nhập từ bàn
phím)
4. Viết hàm tìm số nhỏ nhất trong mảng 1 chiều, tìm tổng
mảng 1 chiều bằng pp đệ quy.
int findmin(int a[], int n)
int findsum(int a[], int n)
1. Viết hàm in ra số nguyên với dấu phẩy phân cách 3 chữ số
printWithCommas(12045670);  12,045,670
printWithCommas(1);  1

07/04/2008 Cao Thái Phương Thanh, khoa Công nghệ Thông tin, ĐH Sài Gòn 13
Tham khảo

• http://en.wikipedia.org/wiki/Recursion

• http://www.sparknotes.com/cs/recursion/examples/summary.
html
• http://www.gailer-
net.de/tutorials/java/Notes/chap72/ch72_1.html
• http://academics.tjhsst.edu/compsci/CS2C/U3/index.html

07/04/2008 Cao Thái Phương Thanh, khoa Công nghệ Thông tin, ĐH Sài Gòn 14

You might also like