[C/C++] Ví dụ giải thuật Đệ quy [Bài tập 16.1.17]

Ví dụ giải thuật Đệ quy

/*
Bài 1: Viết các hàm thực hiện (sử dụng hàm đệ quy):
Tính S= x^2 / 2! + x^4 / 4! + ... + x^(2n) / (2n)!
(Trong đó x, n nhập vào từ bàn phím thỏa mãn 1<x<3; 2<n<100)
*/

#include<iostream.h>
#include<conio.h>
#include<stdio.h>
// var
float x;
int n;
// Input x,n
void Input_x_n(){
cout<<"\n Nhap x, n:";
do{
cout<<"\n x: ";
cin>>x;
if(1>x||x>3)
cout<<"\n Nhap lai x!";
}while(1>x ||x>3);
do{
cout<<"\n n: ";
cin>>n;
if(1>n||n>100)
cout<<"\n Nhap lai n!";
}while(1>n ||n>100);
}
// Luy thua
float LuyThua(float x, int i){
if(i==1) return x;
return LuyThua(x,i-1)*x;
}
// Giai thua
long GiaiThua(int i){
if(i==1) return 1;
return GiaiThua(i-1)*i;
}
// Tinh tong
float TinhTong(int x, int n){
if(n==2) return (x*x)/2;
return LuyThua(x,n)/GiaiThua(n) + TinhTong(x,n-2);
}
// Ham chinh
void main(){
Input_x_n();
cout<<"\n Tong = "<<TinhTong(x,2*n);
getch();
}
// Tinh tong
float TinhTong(int x, int n){
     if(n==2) return (x*x)/2;
     return LuyThua(x,n)/GiaiThua(n) + TinhTong(x,n-2);
}
// Ham chinh
void main(){
Input_x_n();
cout<<"\n Tong = "<<TinhTong(x,2*n);
getch();
}
//---------------------------------------------------

/*
Bài 2: Viết các hàm thực hiện (sử dụng hàm Đệ quy)
- Nhập vào dãy số nguyên dương có n phần tử (2<=n<=100)
- In ra màn hình tất cả số nguyên tố trong dãy
- Tìm UCLN của các số >=5 có trong dãy.

*/

#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<math.h>
// var
int a[100],n;
// Nhap
void Input_Array(){
// Nhap so phan tu mang
cout<<"\n * Nhap so phan tu mang: ";
do{
cout<<"\n n: ";
cin>>n;
if(2>n||n>100)
cout<<"\n Nhap lai n!";
}while(2>n||n>100);
// Nhap mang
cout<<"\n * Nhap mang: ";
for(int i=0;i<n;i++)
do{
cout<<"\n a["<<i<<"]= ";
cin>>a[i];
if(a[i]<=0)
cout<<"\n Nhap lai a["<<i<<"]";
}while (a[i]<=0);
}
// Kiem tra so nguyen to (De quy)
int Test_SNT(int a, int i){
if(a==1||a==2||a==3||i>(int)sqrt(a)) return 1;
if (a%i==0) return 0;
return Test_SNT(a,i+1);
}
// UCLN cua 2 so (De quy)
int UCLN(int a, int b){
if(a==b) return a;
if (a>b) return UCLN(a-b,b);
return UCLN(a,b-a);
}
// UCLN cua day so (De quy)
int UCLN_Array(int a[], int n){
if(n==2)
return UCLN(a[0],a[1]);
    return  UCLN(a[n-1],UCLN_Array(a,n-1));

}
// In UCLN cua cac so >=5 trong day
void In_UCLN(int a[], int n){
// loai cac so < 5 trong mang
int j=0; // so phan tu cua mang moi
int b[100];
for(int i=0;i<n;i++)
if(a[i]>=5) { b[j]=a[i]; j++;}
// UCLN cua ca so >=5 trong day
cout<<"\n * UCLN: "<<UCLN_Array(b,j);
}
// Ham chinh
void main(){
Input_Array();
cout<<"\n * In so nguyen to trong day: \n";
for(int i=0;i<n;i++){
int k=2;
if(Test_SNT(a[i],k)==1)
cout<<a[i]<<"; ";
}
// UCLN cua ca so >=5 trong day
In_UCLN(a,n);
getch();
}
* Lưu ý: 
-  Code chương trình chạy trên TC3.0
-  Các bạn có thể xây dựng giải thuật đệ quy theo cách khác.

----------


Cùng bạn tự học CNTT - tailieucntt.org

0 nhận xét:

Cảm ơn bạn đã quan tâm tới bài viết này!