Tìm Ước Chung Lớn Nhất Bằng Đệ Quy

     
Hàm đệ quy là hầu như hàm điện thoại tư vấn lại chính nó. Nó có lợi trong những tác vụ như thu xếp hoặc đo lường các số giai thừa… Hàm đệ quy tương xứng với khái niệm quy nạp trong toán học.

Bạn đang xem: Tìm ước chung lớn nhất bằng đệ quy


*

Bài tập 1. Tìm bộ phận Fibonacci sản phẩm n (bài toán Fibonacci)Viết công tác tìm thành phần Fibonacci thiết bị n được tư tưởng đệ quy như sau:#include #include /*Ham tra ve so nguyen tinh gia tri Fibonacci thu n*/int F(int n) n==1) return 1; elsereturn F(n-1) + F(n-2);/*Chuong trinh chinh*/void main() clrscr();int n;coutcin>>n;coutgetch();Bài tập 2. Tính X lũy quá nViết công tác tính X nón n cùng với X là số thực, n là số nguyên:Cài đặt:#include #include /*Ham tra ve so thuc tinh gia tri X^n*/float Power(float X, int n) if(n==0)return 1;elsereturn X*Power(X,n-1);/*Chuong trinh chinh*/void main() clrscr();int n;float X;coutcin>>n;coutcin>>X;coutgetch();Bài tập 3. Thuật toán Euclide tìm ước chung bự nhấtViết lịch trình tìm cầu chung lớn số 1 của 2 số nguyên dương a, b bởi thuật toán. Euclide được quan niệm đệ quy như sau:#include #include int UCLN(int a, int b) if(a==b)return a;else if(a>b)return UCLN(a-b,b);elsereturn UCLN(a,b-a);void main() clrscr();int a,b;coutcin>>a;coutcin>>b;coutgetch();Bài tập 4. Tìm mong chung lớn số 1 của n số nguyênViết lịch trình tìm ước chung lớn nhất của n số nguyên dương 0 1 ,..., n a a được quan niệm đệ quy như sau:#include #include /*Ham tra ve sầu uoc tầm thường lon nhat cua a va b*/int UCLN(int a, int b) if(a==b)return a;else if(a>b)return UCLN(a-b,b);elsereturn UCLN(a,b-a);/*Ham tra ve uoc tầm thường lon nhat cua n phan tu duoc luu tru trong mang trong mình một chieu a*/int UC(int a<>, int n) if(n==1)return a<0>;elsereturn UCLN(a,UC(a,n-1));void main() clrscr();int *a,n;coutcin>>n;a = new int;coutfor(int i=0; icoutcin>>a;coutgetch();}Bài tập 5. Tính n giai thừaViết lịch trình tính n! được định nghĩa đệ quy như sau:#include #include /*Ham tra ve so nguyen tinh n! (Factorial)*/long int Fac(int n) if(n==0)return 1;elsereturn n*Fac(n-1);/*Chuong trinh chinh*/void main() clrscr();int n;coutcin>>n;coutgetch();Bài tập 6. Tổng hợp chập k của n phần tửViết lịch trình tính tổng hợp chập k của n được xác minh như sau:#include #include /*C(n,k)=C(n-1,k-1)+c(n-1,k) dk: 0long int C(int n, int k) if (n==k/*Chuong trinh chinh*/void main() clrscr();int n,k;coutcin>>n;coutcin>>k;coutgetch();Bài tập 7. Tính tổng n bộ phận trong danh sáchViết lịch trình tính tổng n phần tử a0, a1 ,..., an. được định nghĩa đệ quy như sau:#include #include /*Ham tra ve so nguyen tinh tong n phan tu trong mang a*/long int S(int a<>, int n) if(n==1)return a<0>;elsereturn a+S(a,n-1);/*Chuong trinh chinh*/void main() clrscr();int *a,n;coutcin>>n;a = new int;coutfor(int i=0; icoutcin>>a;coutgetch();}Bài tập 8. Đệ quy hỗ tươngViết chương trình tính n X cùng n Y được xác định như sau:< thiết lập đặt:>#include #include long int Y(int n);long int X(int n) if(n==0)return 1;elsereturn X(n-1) + Y(n-1);long int Y(int n) if(n==0)return 1;elsereturn 2*X(n-1)*Y(n-1);/*Chuong trinh chinh*/void main() clrscr();int n;coutcin>>n;coutcoutgetch();Bài tập 9. Tích n bộ phận trong danh sáchViết công tác tính tích n phần tử 0 1 ,..., n a a được có mang đệ quy như sau:#include #include /*Ham tra ve so nguyen tinh tich n phan tu trong có a*/long int S(int a<>, int n) if(n==1)return a<0>;elsereturn a*S(a,n-1);/*Chuong trinh chinh*/void main() clrscr();int *a,n;coutcin>>n;a = new int;coutfor(int i=0; icoutcin>>a;coutgetch();}Bài tập 10. Đếm số lần xuất hiện thêm của bộ phận x vào danh sách#include #include /*Ham tra ve so lan xuat hien cua x trong danh sach A*/int Find(int a<>, int n, int x) if(n==0)return 0;elseif(a==x)return 1+Find(a,n-1,x);elsereturn Find(a,n-1,x);/*Chuong trinh chinh*/void main() clrscr();int *a,n,x;coutcin>>n;a = new int;coutfor(int i=0; icoutcin>>a;coutcin>>x;coutgetch();}Bài tập 11. Liệt kê toàn bộ dãy nhị phân độ lâu năm kChỉnh đúng theo lặp chập k của n phần tử là một đội có thiết bị tự có k phần tử lấy từ n thành phần đã cho, trong số ấy mỗi bộ phận có thể có mặt 1, 2, …, k lần vào nhóm chế tạo thành.Phương pháp: ta liệt kê tất cả chỉnh hợp gồm lặp chập k của hai bộ phận 0 và 1. Khi đó ta sẽ sở hữu tất cả hàng nhị phân có độ dài k.Ví dụ: minh họa dạng cây với k = 3.

Xem thêm: Kể Việc Làm Tốt Bảo Vệ Môi Trường

#include #include #define max 20int Luu;int k;/*Xuat ket qua ra man hinh*/void Out() coutfor(int i = 0; icout/*Day nhi phan bởi dai n*/void Try(int i) if(i==k)Out();else for(int j = 0; jLuu = j;Try(i+1);Luu=0;}/*Chuong trinh chinh*/void main() clrscr();coutcin>>k;coutTry(0);getch();//Hàm Try(int i) rất có thể viết lại theo phong cách như sau:void Try(int i) for(int j = 0; jLuu = j;if(i==k-1)Out();elseTry(i+1);}Bài tập 12. Chỉnh đúng theo không lặp chập k của n phần tử
Chỉnh vừa lòng chập k của n bộ phận là một đội nhóm có đồ vật tự có k bộ phận khác nhau được chọn từ n phần tử đã cho.Phương pháp: liệt kê dãy bao gồm độ nhiều năm k với các bộ phận trong hàng được rước từ tập vừa lòng 0,1, … , n-1 các phần tử được đưa vào dãy không được phép trùng nhau.Ví dụ: n = 3 và k = 2 ta sẽ có các dãy nhỏ 0,1, 0,2, 1,0, 1,2, 2,0 cùng 2,1.

Xem thêm: Âm Thanh Là Loại Sóng Âm Là Sóng Dọc Hay Sóng Ngang ? Thế Nào Là Sóng Dọc ?

#include #include #define max 20char DanhDau;int Luu;int n,k;/*Khoi tao cac bien*/void Init() coutcin>>n;coutcin>>k;//khoi tao tat ca cac dinh chua duoc chonfor(int i = 0; iDanhDau = 0;/*Xuat ket qua ra man hinh*/void Out() coutfor(int i = 0; icout/*Chinh hop khong lap chap k*/void Try(int i) if(i==k)Out();else for(int j = 0; jif(DanhDau == 0) //neu dinh j chua duoc chonDanhDau = 1; //chon dinh jLuu = j; //luu lai gia tri jTry(i+1); //tim phan tu tiep theoDanhDau = 0; //phuc hoi dinh j/*Chuong trinh chinh*/void main() clrscr();coutInit();Try(0);getch();//Hàm Try(int i) hoàn toàn có thể viết lại theo cách như sau:void Try(int i) for(int j = 0; jif(DanhDau==0) Luu = j;if(i==n-1)Out();else DanhDau = 1;Try(i+1);DanhDau = 0;Bài tập 13. Hoán vị mảng số nguyên có n phần tử
Phương pháp: tương tự cách thức làm bài xích tập 13 nhưng ở chỗ này ta cố gắng tập đúng theo 0, 1, … , n-1 là tập hợp quý hiếm n phần tử của mảng với độ lâu năm của dãy là n.Ví dụ: n = 3 cùng A = -1,0,1 ta sẽ có được các hàng con khớp ứng là -1,0, -1,1, 0,-1, 0,1, 1,-1 cùng 1,0.#include #include #define max 20char DanhDau; //mang danh dau dinh duoc chonint Luu, A, n;/*Khoi tao cac bien*/void Init() coutcin>>n;for(int i = 0; i/*Danh dau vi tri i chua chon*/DanhDau = 0;coutcin>>A;}/*Xuat ket qua ra man hinh*/void Out() coutfor(int i = 0; icout/*Hoan vi mang n phan tu*/void Try(int i) if(i==n)Out();else for(int j = 0; jif(DanhDau == 0) //neu dinh j chua duoc chonDanhDau = 1; //chon dinh jLuu = A; //luu lai gia tri dinh duoc chonTry(i+1); //tim dinh tiep theoDanhDau = 0; //phuc hoi dinh j/*Chuong trinh chinh*/void main() clrscr();Init();coutTry(0);getch();Hàm Try(int i) có thể viết lại theo phong cách như sau:void Try(int i) for(int j = 0; jif(DanhDau==0) Luu = A;if(i==n-1)Out();else DanhDau = 1;Try(i+1);DanhDau = 0;Bài tập 14. Đặt n quân hậu bên trên bàn cờ vuaMô tả bài toán: liệt kê tất cả phương án để n quân hậu bên trên bàn cờ vua cấp nxn thế nào cho n quân hậu không được phép ăn uống nhau.Ví dụ: cho bàn cờ vua cấp cho 8x8 . Dưới đấy là 1 giải pháp đặt quân hậu:#include #include #define max 20char a; //danh dau cotchar b<2*max-1>; //danh dau huong Dong-Bacchar c<2*max-1>; //danh dau huong Tay-Bacint Luu; //luu ket qua tim duocint n;/*Khoi tao cac bien*/void Init() coutcin>>n;//tat ca cac cot chua duoc chonfor(int i = 0; ia = 0;//tat ca cac huong chua duoc chonfor( i = 0; ib = 0;c = 0;}/*Xuat ket qua ra man hinh*/void Out() coutfor(int i = 0; icout/*Chinh hop khong lap chap k*/void Try(int i) if(i==n)Out();else for(int j = 0; jif(a == 0 && b == 0 && c == 0) a = 1; //danh dau cot jb = 1; //danh dau huong Dong-Bac thu i+jc = 1; //danh dau huong tay-Bac thu j-i+nLuu = j; //luu vi tri dat hau (i,j)Try(i+1); //tim vi tri dat hau tiep theoa = 0; //phuc hoi cot jb = 0; //phuc hoi huong Dong-Bac thu i+jc = 0; //phuc hoi huong tay-Bac thu j-i+n/*Chuong trinh chinh*/void main() clrscr();Init();coutTry(0);getch();Bài tập 15. Mã đi tuầnMô tả bài xích toán: đặt quân mã trên ô có vị trí (x,y) trên bàn cờ vua cấp cho nx n. Hãy liệt kê toàn bộ các phương pháp quân mã khởi hành tại địa chỉ (x,y) rất có thể nhảy đến tất cả các ô khác trên bàn cờ với điều kiện mỗi ô quân mã chỉ được phép trải qua đúng 1 lần.Ví dụ: mang lại bàn cờ vua cung cấp 8x8 . Ta tất cả 2 giải pháp đặt quân mã như sau:#include #include #define max 10int A; //Mang danh dauint B; //Mang luu duong diint X<8>=-1,-2,-2,-1,1,2,2,1;int Y<8>=-2,-1,1,2,2,1,-1,-2;int n, x, y, Dem=0;//Khoi taovoid Init() coutcin>>n;coutcin>>x;coutcin>>y;for(int i = 0; ifor(int j = 0; jA = 0; //tat ca cac o chua duoc danh dauB = 1; //duong di dau tienA = 1; //danh dau o duoc chon//Xuat ket qua ra man hinhvoid Out() Dem++;for(int i = 0; ifor(int j = 0; jprintf("%3d",B);cout}cout}//Tim duong divoid Try(int i) if(i > n*n)Out();else for(int j = 0; jint x1 = x + X;int y1 = y + Y;if(x1>=0 && x1=0 && y1A = 1; //danh dau o (i,j)B = i; //luu lai duong dix = x1; //lay toa vì chưng x moiy = y1; //lay toa bởi y moiTry(i+1); //tim duong di tiep theoA = 0; //phuc hoi o (i,j)B = 0; //xem nhu o chua di quax = x1 - X; //phuc hoi dinh xy = y1 - Y; //phuc hoi dinh y}}//chuong trinh chinhvoid main() clrscr();Init();Try(2);if (Dem==0)coutelsecoutgetch();