Đệ quy đa tuyến (Exponential Recursion) trong C / C++
Trong bài viết này, codehow sẽ giới thiệu đến các bạn hàm đệ quy đa tuyến (Exponential Recursion) trong C / C++. Đây là một hàm được sử dụng khá nhiều trong lập trình, đặc biệt trong việc xử lý sắp xếp.
Chúng ta sẽ cùng nhau tìm hiểu về hàm đệ quy đa tuyến (Exponential Recursion) là gì? Ví dụ sử dụng đệ quy đa tuyến (Exponential Recursion) trong C / C++. Về cơ chế của nó tương tự như các hàm đệ quy khác, vậy nên trong bài viết này mình sẽ không nhắc lại nhữ. Các bạn có thể xem tại đây.
Hàm đệ quy đa tuyến (Exponential Recursion) trong C / ++ là gì?
Thông thường thì hàm gọi đệ quy được đặt trong các vòng lặp. Khi này sẽ thực hiện gọi hàm đệ quy nhiều lần, cho đến khi vòng lặp kết thúc.
Ví dụ: Chúng ta có một hàm đệ quy đa tuyến dưới đây. Hàm này có chức năng tìm dãy nhị phân có chiều dài n.
void daTuyen(int i, int n, int *X) { int val; for (val = 0; val < 2; val++) { X[i] = val; if (i == (n-1)) { int j; for(j = 0; j < n; j ++) { cout<< X[j]; } cout<<"\n"; } else { daTuyen(i+1, n, X); } } }
Như các bạn thấy trong hàm trên, hàm đệ quy được đặt trong vòng lặp for. Như vậy thì hàm đệ quy này có thể được gọi đến n lần, tùy thuộc vào vòng lặp for.
Tương tự như các hàm đệ quy khác như: đệ quy đuôi, đệ quy tuyến tính, ... . Cơ chế hoạt động của đệ quy đa tuyến cũng dựa trên cơ chế LIFO, vậy nên mình sẽ không nhắc lại nữa.
Để hiểu rõ hơn, các bạn có thể xem ví dụ minh họa sử dụng hàm đệ quy đa tuyến phần bên dưới nhé.
Ví dụ sử dụng hàm đệ quy đa tuyến (Exponential Recursion) trong C / C++
Trong phần này mình sẽ thực hiện hai ví dụ sử dụng hàm đệ quy đa tuyến (Exponential Recursion) trong C / C++. Các bạn có thể tham khảo nhé.
Ví dụ 1: Viết chương trình in ra dãy nhị phân có chiều dài n, với n được nhập từ bàn phím.
Chương trình C:
#include <stdio.h> void dayNhiPhan(int i, int n, int *X) { int val;// val là các giá trị có thể gán cho các vị trí trong x for (val = 0; val < 2; val++) // val có thể nhận hai giá trị là 0 và 1 { X[i] = val; if (i == (n-1)) // nếu i là phần tử cuối của dãy { int j; for(j = 0; j < n; j ++) // thì tin ra nhị phân mới tìm được { printf("%d",X[j]); } printf("\n"); } else // nếu i chưa phải là phần tử cuối thì gán cho i sau là i+1. { dayNhiPhan(i+1, n, X); // gọi đệ quy tiếp tục thực hiện hàm } } } int main(void) { int n; printf("Nhập n : "); scanf("%d", &n); int X[n]; printf("Dãy nhị phân có độ dài %d là:\n",n); dayNhiPhan(0, n, X); printf("\n---------------------------------\n"); printf("Chương trình này được đăng tại codehow.net"); return 0; }
Kết quả:
Chương trình C++:
#include<stdio.h> #include<iostream> using namespace std; void dayNhiPhan(int i, int n, int *X) { int val;// val là các giá trị có thể gán cho các vị trí trong x for (val = 0; val < 2; val++) // val có thể nhận hai giá trị là 0 và 1 { X[i] = val; if (i == (n-1)) // nếu i là phần tử cuối của dãy { int j; for(j = 0; j < n; j ++) // thì tin ra nhị phân mới tìm được { cout<<X[j]; } cout<<"\n"; } else // nếu i chưa phải là phần tử cuối thì gán cho i sau là i+1. { dayNhiPhan(i+1, n, X); // gọi đệ quy tiếp tục thực hiện hàm } } } int main() { int n; cout<<"Nhập n : "; cin>>n; int X[n]; cout<<"Dãy nhị phân có độ dài "<<n<<" là:\n"; dayNhiPhan(0, n, X); cout<<"\n--------------------------------\n"; cout<<"Chương trình này được đăng tại codehow.net"; }
Kết quả:
Ví dụ 2: Viết chương trình sắp xếp các phần tử trong mảng. Các phần tử này được nhập bởi người dùng.
Chương trình C++:
#include<stdio.h> #include<iostream> using namespace std; /* hàm xuất các phần tử trong mảng */ void printArr(int arr[], int n){ for(int i = 0; i < n; i++) //chạy vòng lặp từng phần tử trong mảng cout<<arr[i]<<"\t"; // xuất các phần tử trong mảng cout<<endl; } /* hàm sắp xếp các phần tử trong mảng */ void sort(int arr[], int n, int i){ int j, swap; //thực hiện vòng lặp để sắp xếp các phần tử for(j = i + 1; j < n; j++){ if(arr[i] > arr[j]){ // Nếu phần tử trước lớn hơn phần tử sau thì thực hiện tráo đổi vị trí giữa hai phần tử swap = arr[i]; arr[i] = arr[j]; arr[j] = swap; } sort(arr, n, i + 1);//Tiếp tục gọi đệ quy và thực hiện đến khi hàm kết thúc } } int main() { int n; int a[n]; do{ cout << "\nNhập vào số lượng phần tử có trong mảng: "; cin >> n; }while(n <= 0); for(int i = 0;i < n;i++){ cout<<"a["<<i<<"]="; cin >> a[i]; }; sort(a, n, 0); cout<<"Mảng sau khi được sắp xếp: \n"; printArr(a, n); cout<<"\n--------------------------------\n"; cout<<"Chương trình này được đăng tại codehow.net"; }
Kết quả:
Kết luận
Như vậy là chúng ta đã cùng nhau tìm hiểu về hàm đệ quy đa tuyến (Exponential Recursion) trong C / C++. Qua bài viết này, các bạn cần nắm rõ các kiến thức sau đây.
- Hàm đệ quy đa tuyến là một hàm mà khi chúng ta gọi đệ quy có thể phát sinh ra thêm n lần đệ quy khác.
- Hàm đệ quy đa tuyến thường được sử dụng trong các vòng lặp.
Ở bài viết tiếp theo, mình sẽ giới thiệu đến các bạn hàm đệ quy lồng trong C / C++. Các bạn nhớ cú ý theo dõi nhé, cảm ơn các bạn rất nhiều !!!