LATEST

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

Trong bài viết này, codehow sẽ giới thiệu đến các bạn hàm đệ quy là gì? các loại hàm đệ quy trong C / C++. Đây là một khái niệm khá lạ đối với các bạn mới bắt đầu học lập trình, tuy nhiên đừng vội lo lắng nhé. Serries cấu trúc dữ liệu và giải thuật của codehow sẽ giúp các bạn hiểu rõ hơn về nó.

Chúng ta sẽ cùng nhau tìm hiểu về khái nhiệm hàm đệ quy là gì? Cách thức nó hoạt động và có bao nhiêu loại hàm đệ quy trong C / C++. Bây giờ hãy bắt đầu cùng mình thôi nhé.

Hàm đệ quy là gì?

Hàm đệ quy là một hàm nếu trong thân hàm có một hoặc nhiều lệnh gọi lại chính hàm đó và truyền đúng tham số mà hàm khai báo.

Cú pháp:

HamDeQuy(){
    HamDeQuy(); //gọi lại chính nó
}

Như các bạn đã thấy thì trong cú pháp, HamDeQuy() thực hiện gọi chính nó trong thân hàm. Một hàm tương tự như vậy được gọi là hàm đệ quy.

Hàm đệ quy trong C / C++ cũng tương tự như các vòng lặp, nó cũng phải cần xác định được điểm dừng. Nếu không xác định được điểm dừng sẽ dẫn đến tình trạng lặp vô hạn (Stack Overhead).

Mình sẽ lấy ví dụ tính giai thừa để minh họa cho việc sử dụng hàm đệ quy nhé.

Ví dụ: Chúng ta cần tính giai thừa của số nguyên 5.

5! = 5 * 4!
4! = 4 * 3!
…
1! = 1 * 0!

Dựa vào quy luật trên, ta có công thức tính giai thừa của một số nguyên n.

n! = n * (n-1)!

Đối với công thức trên, ta thấy nếu n = 0 hoặc = 1 thì kết quả tính giai thừa luôn bằng 1. Vì vậy đây chính là điểm dừng của hàm đệ quy.

Áp dụng công thức trên, chúng ta có hàm đệ quy tính giai thừa của một số nguyên dương n trong C / C++ như sau:

int giaiThua(int n){
    if(n<=1) return 1;
    return n * giaiThua(n-1);
}

Dưới đây là hai chương trình tính giai thừa của số nguyên dương n, các bạn có thể tham khảo nhé. Mình đã viết bằng hai ngôn ngữ khác nhau là C và C++.

Chương trình C:

#include <stdio.h>

int GiaiThua(int n) {
    // Trường hợp người dùng nhập n == 1 thì thoát khỏi đệ quy
    if (n == 1)
        return 1;
    else
    //ngược lại thì gọi hàm đệ quy với tham số n - 1
        return (n * GiaiThua(n - 1));
}
 

int main(void) {
  //khai báo biến n là số cần tính giai thừa
    int n;
  //yêu cầu người dùng nhập vào số n cần tính giai thừa
    printf("Nhập số nguyên dượng n cần tính giai thừa: ");
    scanf("%d", &n);
    //hiển thị kết quả sau khi tính bằng cách gọi hàm tính giai thừa
    printf("Giai thừa của %d là: %d",n,GiaiThua(n));

    printf("\n---------------------------------\n");
    printf("Chương trình này được đăng tại codehow.net");
    return 0;  
}

Kết quả:

bai16 03 png

Chương trình C++:

#include<iostream>  
using namespace std;
int GiaiThua(int n) {
    // Trường hợp người dùng nhập n == 1 thì thoát khỏi đệ quy
    if (n == 1)
        return 1;
    else
    //ngược lại thì gọi hàm đệ quy với tham số n - 1
        return (n * GiaiThua(n - 1));
}
 
int main()   
{    
  //khai báo biến n là số cần tính giai thừa
    int n;
  //yêu cầu người dùng nhập vào số n cần tính giai thừa
    cout << "Nhập số nguyên dượng n cần tính giai thừa: ";
    cin >> n;
    //hiển thị kết quả sau khi tính bằng cách gọi hàm tính giai thừa
    cout << "Giai thừa của " << n << " là: " << GiaiThua(n) << endl;

    cout<<"\n---------------------------------\n";
    cout<<"Chương trình này được đăng tại codehow.net";
    return 0;  
}

Kết quả:

bai16 02 png

Cơ chế hoạt động của hàm đệ quy trong C / C++

Hàm đệ quy trong C / C++ hoạt động dựa trên cơ chết LIFO (Last In First Out) hay còn gọi là cơ chế Stack. Hiểu đơn giản hơn là vào sau - ra trước.

Để mình lấy một ví dụ thực tế trong cuộc sống để các bạn dễ hình dung nhé.

Ví dụ: Giả sử chúng ta bỏ từng gói mì vào thùng trước, sau đó dùng keo dán thùng lại. Vậy đến khi muốn lấy mì, ta phải tháo keo trên thùng ra, khi đó mới có thể lấy mì trong thùng.

bai16 01 png

Đây là cơ chế hoạt động chung của hàm đệ quỵ trong C / C++, mỗi loại hàm đệ quy sẽ hoạt động riêng theo một quy luật khác nhau. Ở các bài viết tiếp theo, mình sẽ giải thích từng loại hàm đệ quy nhé.

Kết luận: Hàm đệ quy hoạt động dựa vào cơ chế LIFO (Last In First Out).

Các loại hàm đệ quy trong C / C++

Trong lập trình C / C++, chúng ta có 6 loại hàm đệ quy cơ bản dưới đây.

  • Đệ quy tuyến tính.
  • Đệ quy đuôi.
  • Đệ quy nhị phân.
  • Đệ quy đa tuyến.
  • Đệ quy lồng.
  • Đệ quy tương hỗ.

Mỗi hàm đệ quy có một quy luật hoạt động riêng, đó là điểm đặc trưng của từng loại.

Có một bài toán nổi tiếng áp dụng thuật toán đệ quy để giải đó chính là "bài toán tháp Hà Nội". Mình sẽ hướng dẫn giải bài toán cụ thể ở một bài viết khác, các bạn nhớ chú ý theo dõi nhé.

Ngoài ra còn có một số bài toán khác như: Chuỗi Fibonanci, Giai thừa, ... .

Kết luận

Như vậy là chúng ta đã cùng nhau tìm hiểu về hàm đệ quy là gì? Các loại hàm đệ quy trong C / C++. Qua bài viết, các bạn chỉ cần lưu ý cho mình ba kiến thức.

  • Điểm dừng của hàm đệ quy.
  • Cơ chế hoạt động của hàm đệ quy (LIFO).
  • Các loại hàm đệ quy trong C / C++.

Cảm ơn các bạn rất nhiều, hẹn gặp lại các bạn ở bài viết khác nhé !!

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 đa tuyến (Exponential Recursion) trong C / C++

Đệ quy đa tuyến (Exponential 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++

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