- Back to Home »
- C »
- C - Recursion
Monday, April 27, 2015
Recursion - Đệ quy là quá trình mà một hàm gọi chính nó, nghe khá trừu tượng và khó hiểu. Trong hàm đệ quy luôn phải có một biến điều kiện để đến một thời điểm nào đó không thực hiện gọi chính nó nữa, nếu không sẽ rơi vào trang thái tắc nghẽn trong hàm và không thể thoát được hàm dẫn đến chương trình bị treo hoặc crass. Để cho dễ hiểu khái niệm đệ quy, ta cứ giả sử rằng có nhiều hàm có tên khác nhau nhưng trong ruột thực hiện các phép toán giống nhau, và việc đệ quy tương tự hàm này gọi hàm kia thành một chuỗi liên tục, nói cách khác đệ quy là gọi các hàm con có tên trùng với tên hàm cha.
void recursion()
{
if(Expressions){
recursion(); /* function calls itself */
}
}
int main()
{
recursion();
}
Đệ quy thường được dùng cho các bài toán có tính lặp lại một việc, ví dự bài toán scan thư mục trong máy tính: Ban đầu scan thư mục gốc A nào đó, trong lúc scan gặp một thư mục con là B, lại scan thư mục con B đó, mà việc scan thu muc B ta phải làm các thủ tục y nhu khi scan thu muc A, điều đó dẫn đến việc ta gọi hàm đệ quy khi gặp thư mục B. Việc scan thư mục A tạm dùng vì chương trình nhảy vào chương trình con đệ quy để scan thư mục B, ví dụ trong lúc scan B gặp thì có một thư mục C là con của B, tiến hành gọi đệ quy. Sau khi scan hết thư mục C thì return về để tiếp tục scan B, scan xong B thì return lại A, quá trình đó cứ lặp đi lặp lại cho đến khi nào scan hế tất cả các thư mục trong thư mục gốc A thì hoàn thành để return về chương thình chính.
Một ví dụ nữa của hàm đệ quy là duyệt các node trong file xml cũng tương tự nhu scan thư mục.
Ex:
recursion.c (note: vd chi ap dung cho in = 3 thoi nhe)
#include <stdio.h>
#include <string.h>
void recursion(int in){
printf("in = %d \n", in);
if(in > 0){
in--;
recursion(in);
}else{
//exit
}
}
void recursion_deep3(int in){
printf("in = %d \n", in);
if(in > 0){
in--;
}else{
//exit
}
}
void recursion_deep2(int in){
printf("in = %d \n", in);
if(in > 0){
in--;
recursion_deep3(in);
}else{
//exit
}
}
void recursion_deep1(int in){
printf("in = %d \n", in);
if(in > 0){
in--;
recursion_deep2(in);
}else{
//exit
}
}
void recursion_deep(int in){
printf("in = %d \n", in);
if(in > 0){
in--;
recursion_deep1(in);
}else{
//exit
}
}
int main()
{
recursion(3); //de qu
printf("\n");
recursion_deep(3); //tuong tu nhu viec goi mot chuoi cac ham con
return 0;
}
Compile & Execute:
$ gcc recursion.c
$ ./a.out
in = 3
in = 2
in = 1
in = 0
in = 3
in = 2
in = 1
in = 0