LATEST

Đệ quy tuyến tính (Linear 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 tuyến tính (Linear Recursion) trong C / C++. Đây là một trong 6 loại hàm đệ quy trong lập trình C / C++, được sử dụng nhiều nhất bởi tính căn bản của nó.

Chúng ta sẽ cùng nhau tìm hiểu về hàm đệ quy tuyến tính là gì? Cách nó hoạt động ra sao. Sau đó mình sẽ đưa ra ví dụ cụ thể sử dụng hàm đệ quy tuyến tính (Linear Recursion) trong C / C++.

Hàm đệ quy tuyến tính (Linear Recursion) trong C / C++ là gì?

Hàm đệ quy tuyến tính là hàm chỉ gọi chính nó một lần trong thân hàm. HIểu một cách đơn giản thì chỉ có duy nhất một câu lệnh gọi chính hàm đó thì được gọi làm hàm đệ quy tuyến tính (Linear Recursion).

Cú pháp:

HamDeQuy(){
    HamDeQuy(); 
}

Ví dụ: Ta có hàm đệ quy tính giai thừa là một hàm đệ quy tuyến tính.

int factorial(int n){
    if(n == 0) return 1;
    return n * factorial(n-1);
}

Cơ chế hoạt động của hàm đệ quy tuyến tính (Linear Recursion) trong C / C++

Như đã nói ở bài viết trước, thì hàm đệ quy sẽ hoạt động dựa trên cơ chế LIFO (Last In First Out). Vậy nên hàm đệ quy tuyến tính trong C / C++ cũng sẽ hoạt động dựa trên cơ chế này.

Để hiểu rõ hơn, mình sẽ lấy ví dụ về hàm tính giai thừa của một số nguyên dương n. Sau đó chạy thử hàm đệ quy cho các bạn xem nhé.

int factorial(int n){
    if(n == 0) return 1;
    return n * factorial(n-1);
}

Bây giờ, giả sử mình muốn tính 5! sử dụng hàm đệ quy tuyến tính trên, khi đó hàm sẽ chạy như thế nào?

bai17 01 png

Như các bạn thấy trong hình, cứ sau mỗi lần gọi hàm nó sẽ đẩy kết quả vào trong Stack. Đầu tiên là 5 - 4 - 3 - 2 - 1 - 1, khi này hết gọi hàm đệ quy. Sau đó gọi Stack để lấy kết quả, thực hiện lấy từ trên xuống vì dựa vào cơ chế LIFO 1 - 1 - 2 - 3 - 4 - 5.

Kết quả sẽ bằng 1 * 1 * 2 * 3 * 4 * 5 = 120.

Ví dụ sử dụng hàm đệ quy tuyến tính (Linear Recursion) trong C / C++

Trong phần này, mình sẽ thực hiện chương trình tính giải thừa của một số được nhập từ bàn phím. Sử dụng hàm đệ quy tuyến tính để tính toán và hiển thị kết quả ra màn hình.

Đầu tiên chúng ta sẽ viết hàm tính giai thừa, hàm này được tạo theo dạng đệ quy tuyến tính. Điều kiện dừng của hàm là n == 1.

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));
}

Tiếp đến khai báo biến n thuộc kiểu int, sau đó yêu cầu người dùng nhập giá trị cho n.

//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);

Cuối cùng là gọi hàm tính giai thừa và truyền tham số là giá trị vừa nhập bởi người dùng.

//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));

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

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

bai17 03 png

Kết luận

Như vậy là chúng ta đã cùng nhau tìm hiểu về hàm đệ quy tuyến tính (Linear Recursion) trong C / C++. Qua bài viết này, mình muốn các bạn nắm vững các kiến thức dưới đây:

  • Hàm đệ quy tuyến tính là hàm chỉ có duy nhất một câu lệnh gọi lại chính nó trong thân hàm.
  • Hàm đệ quy tuyến tính hoạt động dựa trên cơ chế LIFO.
  • Ví dụ hàm tính giai thừa là hàm đệ quy tuyến tính.

Ở bài viết tiếp theo, mình sẽ giới bạn loại hàm đệ quy tiếp theo là hàm đệ quy đuối (Tail Recursion). Các bạn chú ý theo dõi nhé, cảm ơ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 đ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++

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