You are on page 1of 11

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

THỰC HÀNH BUỔI 1


GV: GS.TS VÕ NGUYỄN QUỐC BẢO

Tên: Lê Thị Ngọc Trâm Lớp: D21CQVT01-N


MSSV: N21DCVT106 Nhóm: 2

Bài tập phần đệ qui


Ví dụ 1: Tìm tổng của n số tự nhiên bằng phương pháp đệ qui.
#include <iostream>
using namespace std;
int Tong(int n) {
if (n == 1)
return 1;
else return n + Tong(n - 1);
}
int main() {
int n;
cout << "Nhap so n: ";
cin >> n;
if (n < 1) {
cout << "Vui long nhap mot so nguyen duong." << endl;
return 1;
}
int result = Tong(n);
cout<<"Tong cua "<< n <<" so tu nhien la "<< result;
return 0;
}
Ví dụ 2. Tìm n!
#include <iostream>
using namespace std;
long Giaithua(int i) {
if (i == 0) {
return 1;
} else {
return i * Giaithua(i - 1);
}
}
int main() {
int n;
cout << "Nhap gia tri n: ";
cin >> n;
if (n < 0) {
cout << "Khong ton tai giai thua cho so am.";
}
else {
long result = Giaithua(n);
cout << n << "! = " << result << endl;
}
return 0;
}
Ví dụ 3: Tìm ước số chung lớn nhất của a và b bằng phương pháp đệ qui.
#include <iostream>
using namespace std;
int USCLN(int a, int b) {
if (a == b) {
return a;
}
else {
if (a > b) {
return USCLN(a - b, b);
} else {
return USCLN(a, b - a);
}
}
}
int main() {
int a, b;
cout << "Nhap gia tri a: ";
cin >> a;
cout << "Nhap gia tri b: ";
cin >> b;
if (a <= 0 || b <= 0) {
cout << "Vui long nhap so nguyen duong.";
} else {
int result = USCLN(a, b);
cout << "USCLN cua " << a << " va " << b << " la: " << result << endl;
}
return 0;
}
Ví dụ 4. Bài toán tháp Hà Nội. Có n đĩa bạc có đường kính khác nhau được đặt
chồng lên nhau. Các đĩa được đặt chồng lên nhau theo thứ tự giảm dần của
đường kính. Có ba vị trí A, B, C có thể đặt đĩa. Chồng đĩa ban đầu đặt ở vị trí A.
Một nhà sư chuyển các đĩa từ vị trí A sang vị trí B thỏa mãn điều kiện:
• Khi di chuyển một đĩa phải đặt vào ba vị trí đã cho.
• Mỗi lần chuyển một đĩa và phải là đĩa trên cùng.
• Tại một vị trí đĩa được đặt cũng phải lên trên cùng.
• Đĩa lớn hơn không được phép đặt trên đĩa nhỏ hơn.
#include <iostream>
using namespace std;
void HanoiTower(int n, char nguon, char dich, char trunggian) {
if (n == 1) {
cout << "Chuyen dia 1 tu cot " << nguon << " sang cot " << dich << endl;
return;
} else {
HanoiTower(n - 1, nguon, trunggian, dich);
cout << "Chuyen dia " << n << " tu cot " << nguon << " sang cot " << dich << endl;
HanoiTower(n - 1, trunggian, dich, nguon);
}
}
int main() {
int n;
cout << "Nhap so luong dia: ";
cin >> n;
if (n <= 0) {
cout << "Vui long nhap so nguyen duong.";
} else {
char nguon = 'A', trunggian = 'C', dich = 'B';
HanoiTower(n, nguon, dich, trunggian);
}
return 0;
}
Bài tập 1: Cho số tự nhiên n. Hãy in ngược lại dãy số tự nhiên ngược lại từ n đến 1. Ví dụ
n=5, ta in ngược lại là : 5 4 3 2 1.
#include <iostream>
using namespace std;
void inNguoc(int n) {
if (n <= 0) {
return;
}
cout << n << " ";
inNguoc(n - 1);
}
int main() {
int n;
cout << "Nhap so nguyen n: ";
cin >> n;
cout << "Day so nguoc tu " << n << " den 1 la: ";
inNguoc(n);
return 0;
}
Bài tập 2: Nâng số tự nhiên x lên lũy thừa n.
#include <iostream>
using namespace std;
long long luyThua(int x, int n) {
if (n == 0) {
return 1;
}
long long temp = luyThua(x, n / 2);
if (n % 2 == 0) {
return temp * temp;
} else {
return x * temp * temp;
}
}
int main() {
int x, n;
cout << "Nhap so nguyen x: ";
cin >> x;
cout << "Nhap so nguyen n: ";
cin >> n;
if (n < 0) {
cout << "Khong ho tro luy thua am." << endl;
} else {
long long ketQua = luyThua(x, n);
cout << x << "^" << n << " = " << ketQua;
}
return 0;
}
Bài tập 3: Tìm số fibonacci thứ n.
#include <iostream>
using namespace std;
long long fibo(int n){
if(n==1) return 0;
else if(n==2) return 1;
else return fibo(n-1) + fibo(n-2);
}
int main() {
int n;
cout << "Nhap so nguyen n: ";
cin >> n;
if (n < 0) {
cout << "Khong co so Fibonacci cho so am." << endl;
} else {
int ketQua = fibo(n);
cout << "So Fibonacci thu " << n << " la: " << ketQua << endl;
}
return 0;
}
Bài tập 4: Đảo ngược một xâu ký tự.
#include <iostream>
using namespace std;
void DaoNguocXau(string &str, int start, int end) {
if (start < end) {
swap(str[start], str[end]);
DaoNguocXau(str, start + 1, end - 1);
}
}
int main() {
string input;
cout << "Nhap xau ky tu: ";
getline(cin, input);
DaoNguocXau(input, 0, input.length() - 1);
cout << "Xau sau khi dao nguoc: " << input;
return 0;
}
Bài tập 5: Tìm vị trí của x trong dãy số A = { A0, A1, A2, .., An-1}.
#include <iostream>
using namespace std;
int TimViTri(const int A[], int n, int x, int currentIndex) {
if (currentIndex == n) {
return -1;
} else if (A[currentIndex] == x) {
return currentIndex;
} else {
return TimViTri(A, n, x, currentIndex + 1);
}
}
int main() {
int n, x;
cout << "Nhap so luong phan tu cua day so: ";
cin >> n;
int A[n];
cout << "Nhap gia tri cho day so:\n";
for (int i = 0; i < n; ++i) {
cout << "Nhap phan tu thu " << i << ": ";
cin >> A[i];
}
cout << "Nhap gia tri x can tim: ";
cin >> x;
int viTri = TimViTri(A, n, x, 0);
if (viTri != -1) {
cout << "Phan tu " << x << " duoc tim thay tai vi tri " << viTri << endl;
} else {
cout << "Phan tu " << x << " khong co trong day so." << endl;
}
return 0;
}
Bài tập 6: Tìm tổng của các chữ số trong số tự nhiên K.
#include <iostream>
using namespace std;
int TinhTongChuSo(int K) {
if (K == 0) {
return 0;
} else {
return K % 10 + TinhTongChuSo(K / 10);
}
}
int main() {
int K;
cout << "Nhap mot so tu nhien K: ";
cin >> K;
if (K < 0) {
cout << "Vui long nhap mot so tu nhien.\n";
} else {
int tongChuSo = TinhTongChuSo(K);
cout << "Tong cac chu so cua " << K << " la: " << tongChuSo;
}
return 0;
}
Bài tập 7: Tìm tổng của tất cả các phần tử của dãy số A = { A0, A1, A2, .., An-1}.
#include <iostream>
#include <vector>
using namespace std;
int TinhTong(const vector<int>& A, int currentIndex) {
if (currentIndex == A.size()) {
return 0;
} else {
return A[currentIndex] + TinhTong(A, currentIndex + 1);
}
}
int main() {
int n;
cout << "Nhap so luong phan tu cua day so: ";
cin >> n;
vector<int> A(n);
cout << "Nhap gia tri cho day so:\n";
for (int i = 0; i < n; ++i) {
cin >> A[i];
}
int tong = TinhTong(A, 0);
cout << "Tong cac phan tu cua day so la: " << tong << endl;
return 0;
}
Bài tập 8: Đổi số tự nhiên n thành số nhị phân.
#include <iostream>
using namespace std;
void ChuyenDoiNhiPhan(int n) {
if (n > 0) {
ChuyenDoiNhiPhan(n / 2);
cout << n % 2;
}
}
int main() {
int n;
cout << "Nhap mot so tu nhien n: ";
cin >> n;
if (n < 0) {
cout << "Vui long nhap mot so tu nhien.\n";
} else {
cout << "So nhi phan cua " << n << " la: ";
ChuyenDoiNhiPhan(n);
cout << endl;
}
return 0;
}

You might also like