Professional Documents
Culture Documents
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
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.
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);
}
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);
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
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