LATEST

Đệ 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ì?

Hàm đệ quy đa tuyến (Exponential Recursion) là một hàm mà khi chúng ta gọi đệ quy, nó sẽ phát sinh ra thêm n lần đệ quy khác. Hiểu đơn giản hơn thì một hàm có n lần đệ quy trong thân hàm gọi là hàm đệ quy đa tuyến.

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ả:

bai20 02 PNG

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ả:

bai20 01 PNG

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ả:

bai20 03 PNG

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 !!!

Cùng chuyên mục:

Danh sách liên kết (Linked List) là gì? Các loại danh sách liên kết

Danh sách liên kết (Linked List) là gì? Các loại danh sách liên kết

Sử dụng đệ quy để giải bài toán tháp Hà Nội

Sử dụng đệ quy để giải bài toán tháp Hà Nội

Đệ quy tương hỗ (Mutual Recursion) trong C / C++

Đệ quy tương hỗ (Mutual Recursion) trong C / C++

Đệ quy lồng (Nested Recursion) trong C / C++

Đệ quy lồng (Nested Recursion) trong C / C++

Đệ quy nhị phân (Binary Recursion) trong C / C++

Đệ quy nhị phân (Binary Recursion) trong C / C++

Đệ quy đuôi (Tail Recursion) trong C / C++

Đệ quy đuôi (Tail Recursion) trong C / C++

Đệ quy tuyến tính (Linear Recursion) trong C / C++

Đệ quy tuyến tính (Linear Recursion) trong C / C++

Hàm đệ quy là gì? Các loại hàm đệ quy trong C / C++

Hàm đệ quy là gì? Các loại hàm đệ quy trong C / C++

Thuật toán sắp xếp Quick Sort trong C / C++

Thuật toán sắp xếp Quick Sort trong C / C++

Thuật toán sắp xếp trộn (Merge Sort) trong C / C++

Thuật toán sắp xếp trộn (Merge Sort) trong C / C++

Thuật toán sắp xếp chọn (Selection Sort) trong C / C++

Thuật toán sắp xếp chọn (Selection Sort) trong C / C++

Thuật toán sắp xếp chèn (Insertion Sort) trong C / C++

Thuật toán sắp xếp chèn (Insertion Sort) trong C / C++

Thuật toán sắp xếp nổi bọt (Bubble Sort) trong C / C++

Thuật toán sắp xếp nổi bọt (Bubble Sort) trong C / C++

Thuật toán tìm kiếm nội suy (Interpolation Search) trong C / C++

Thuật toán tìm kiếm nội suy (Interpolation Search) trong C / C++

Thuật toán tìm kiếm nhị phần (Binary Search) trong C / C++

Thuật toán tìm kiếm nhị phần (Binary Search) trong C / C++

Thuật toán tìm kiếm tuyến tính (Linear Search) trong C / C++

Thuật toán tìm kiếm tuyến tính (Linear Search) trong C / C++

Thuật toán kiểm tra năm nhuận trong C / C++

Thuật toán kiểm tra năm nhuận trong C / C++

Thuật toán kiểm tra số chẵn lẻ trong C / C++

Thuật toán kiểm tra số chẵn lẻ trong C / C++

Thuật toán tính lũy thừa trong C / C++

Thuật toán tính lũy thừa trong C / C++

Thuật toán tìm ước chung lớn nhất trong C / C++

Thuật toán tìm ước chung lớn nhất trong C / C++

Top