LATEST

Đệ quy tương hỗ (Mutual 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 tương hỗ (Mutual Recursion) trong C / C++. Đây là hàm đệ quy cuối cùng mà mình giới thiệu đến các bạn, ở các bài viết trước mình đã giới thiệu qua 5 hàm đệ quy trong C / C++.

Chúng ta sẽ cùng nhau tìm hiểu về hàm đệ quy tương hỗ (Mutual Recursion) là gì? Cơ chế hoạt động của nó, cùng với đó là ví dụ sử dụng nó trong C / C++.

Hàm đệ quy tương hỗ (Mutual Recursion) trong C / C++ là gì?

Hàm đệ quy tương hỗ (Mutual Recursion) là hàm không gọi trực tiếp đệ quy chính nó. Thay vào đó sẽ gọi đệ quy một hàm khác, mà trong hàm này lại gọi đệ quy nó.

Ví dụ: Mình có hàm A() gọi đệ quy hàm B(), mà bên trong hàm B() lại gọi đệ quy hàm A().

int A();
int B();
int A(){
   B();
}
int B(){
   A();'
}

Ví dụ: Mình có hàm đệ quy tương hỗ dùng để kiểm tra số chẵn hay số lẻ.

bool isEven(int n);
bool isOdd(int n);
 
bool isEven(int n){
  if(n == 0)
    return true;
  else
    return isOdd(n - 1);
}
 
bool isOdd(int n){
  return !isEven(n);
}

Ta có hai hàm đó là IsEven() dùng để kiểm tra số chẵn và hàm IsOld() để kiểm tra số lẻ. Hai hàm này gọi qua lại với nhau, như vậy được xem là hàm đệ quy tương hỗ.

Cơ chế hoạt động của hàm đệ quy tương hỗ (Mutual Recursion) trong C / C++

Mình sẽ sử dụng ví dụ ở phần một để thực hiện cơ chế hoạt động của hàm đệ quy tương hỗ (Mutual Recursion) trong C / C++.

Thật ra đối với bài toán kiểm tra số chãn lẻ không cần sử dụng đến đệ quy, tuy nhiên vì đây là bài toán cơ bản, nên các bạn sẽ dễ hình dung hơn.

Số chẵn là số khi chúng ta chia hết cho 2 (2n) và số lẻ là số chia cho 2 dư 1 (2n - 1).

bool isEven(int n);
bool isOdd(int n);
 
bool isEven(int n){
  if(n == 0)
    return true;
  else
    return isOdd(n - 1);
}
 
bool isOdd(int n){
  return !isEven(n);
}

Hàm IsEven() sẽ trả về true nếu là số chẵn và trả về false nếu là số lẻ. Bây giờ mình giả sử truyền vào số n = 5. Khi đó hàm đệ quy tương hỗ sẽ hoạt động như dưới đây.

bai22 01 png

Như hình trên, chúng ta lần lượt gọi đệ quy hàm IsEven(), sau đó lại gọi hàm đệ quy IsOld(), cứ như vậy cho đến khi n == 0. Đây là điều kiện dừng của hàm đệ quy. kết quả cuối cùng trả về là !!!!!true = false.

*Lưu ý: Toán tử NOT (!) là một toán tử đảo ngược trạng thái, ví dụ đang là true thì !true sẽ bằng fasle.

Dựa vào hàm đệ quy tương hỗ trên, mình sẽ thực hiện chương trình kiểm tra số chẵn lẻ trong C / C++. Chương trình này sẽ được viết bằng hai ngôn ngữ khác nhau là C và C++, các bạn có thể tham khảo nhé.

Chương trình C:

#include <stdio.h>
#include <stdbool.h>
bool isEven(int n);
bool isOdd(int n);
 
bool isEven(int n){
  if(n == 0)
    return true;
  else
    return isOdd(n - 1);
}
 
bool isOdd(int n){
  return !isEven(n);
}

int main() {
  int n = 5;
  bool kq = isEven(n);
  if(kq == true)
    printf("%d là số chẵn",n);
  else 
    printf("%d là số lẻ",n);
 
  printf("\n---------------------------\n");
  printf("Chương trình này được đăng tại codehow.net");
}

Chương trình C++:

#include <iostream>
using namespace std;
 
bool isEven(int n);
bool isOdd(int n);
 
bool isEven(int n){
  if(n == 0)
    return true;
  else
    return isOdd(n - 1);
}
 
bool isOdd(int n){
  return !isEven(n);
}
int main() {
  int n = 5;
  bool kq = isEven(n);
  if(kq == true)
    cout<<n<<" là số chẵn";
  else 
    cout<<n<<" là số lẻ";
 
  cout<<"\n---------------------------\n";
  cout<<"Chương trình này được đăng tại codehow.net";
}

Kết quả:

bai22 02 png

Kết luận

Như vậy là chúng ta đã cùng nhau tìm hiểu về hàm đệ quy tương hỗ (Mutual Recursion) trong C / C++. Các bạn cần nắm vững các kiến thức dưới đây của hàm đệ quy tương hỗ:

  • Hàm đệ quy tương hỗ là hàm gọi đệ quy hàm khác, mà hàm này lại gọi đệ quy lại nó.
  • Cơ chế hoạt động tuần tự theo các hàm đệ quy.

Đây cũng là hàm đệ quy cuối cùng mà mình muốn giới thiệu đến các bạn. 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:

Xóa node khỏi cây nhị phân tìm kiếm

Xóa node khỏi cây nhị phân tìm kiếm

Tìm node Max và Min trong cây nhị phân tìm kiếm

Tìm node Max và Min trong cây nhị phân tìm kiếm

Xuất node con và node lá trong cây nhị phân tìm kiếm

Xuất node con và node lá trong cây nhị phân tìm kiếm

Tìm kiếm trên cây nhị phân tìm kiếm

Tìm kiếm trên cây nhị phân tìm kiếm

Duyệt cây nhị phân tìm kiếm

Duyệt cây nhị phân tìm kiếm

Thêm node vào cây nhị phân tìm kiếm

Thêm node vào cây nhị phân tìm kiếm

Cây nhị phân (Binary tree) là gì? Cơ chế hoạt động của nó

Cây nhị phân (Binary tree) là gì? Cơ chế hoạt động của nó

Cách gộp hai danh sách liên kết đôi

Cách gộp hai danh sách liên kết đôi

Tìm kiếm phần tử trong DSLK đôi

Tìm kiếm phần tử trong DSLK đôi

Xóa node trong DSLK đôi

Xóa node trong DSLK đôi

Chèn node (Insert node) vào DSLK đôi

Chèn node (Insert node) vào DSLK đôi

Duyệt danh sách liên kết đôi

Duyệt danh sách liên kết đôi

Tạo node mới trong DSLK đôi

Tạo node mới trong DSLK đôi

DSLK đôi là gì? Cấu trúc dữ liệu của DSLK đôi

DSLK đôi là gì? Cấu trúc dữ liệu của DSLK đôi

Quản lý sinh viên bằng DSLK đơn

Quản lý sinh viên bằng DSLK đơn

Tìm kiếm và sắp xếp trong DSLK đơn

Tìm kiếm và sắp xếp trong DSLK đơn

Xóa node (Delete node) trong DSLK đơn

Xóa node (Delete node) trong DSLK đơn

Chèn node (Insert node) vào DSLK đơn

Chèn node (Insert node) vào DSLK đơn

Tạo node mới trong DSLK đơn

Tạo node mới trong DSLK đơn

Cấu trúc dữ liệu của DSLK đơn

Cấu trúc dữ liệu của DSLK đơn