You are on page 1of 12

Tính tổng hàm S(n) = 1 + 2 + 3 + 4 + .. + n bằng đệ quy.

Nếu bạn chưa biết thì S(n) có thể tính nhanh bằng
công thức S(n) = n * (n + 1) / 2:

#include <stdio.h>

#include <math.h>

int tong(int n){

if(n == 1) return 1;

return n + tong(n - 1);

int main(){

int n; scanf("%d", &n);

printf("%d", tong(n));

Tính tổng hàm S(n) = 1^2 + 2^2 + 3^2 + 4^2 + .. + n^2 bằng đệ quy. Nếu bạn chưa biết thì S(n) có thể tính
nhanh bằng công thức S(n) = n * (n + 1) * (2n + 1) / 6:

#include <stdio.h>

#include <math.h>

int tong(int n){

if(n == 1) return 1;

return n*n + tong(n - 1);

int main(){

int n; scanf("%d", &n);

printf("%d", tong(n));

Tính tổng hàm S(n) = 1^3 + 2^3 + 3^3 + 4^3 + .. + n^3 bằng đệ quy. Nếu bạn chưa biết thì S(n) có thể tính
nhanh bằng công thức S(n) = [(n * (n + 1) / 2)]^2:

#include <stdio.h>

#include <math.h>
long long tong(int n){

if(n == 1) return 1;

return n*n*n + tong(n - 1);

int main(){

int n; scanf("%d", &n);

printf("%lld", tong(n));

Tính tổng hàm S(n) = -1 + 2 -3 + 4 - 5 + 6 + ... + (-1)^n * n bằng đệ quy. Nếu bạn chưa biết thì
S(n) có thể tính nhanh bằng công thức Nếu N chẵn thì S(n) = n / 2, còn nếu N lẻ thì S(n) = (n -
1) / 2 – n :
#include <stdio.h>
#include <math.h>
long long tong(int n){
if(n == 1) return -1;
if(n % 2 == 0) return n + tong(n - 1);
else return - n + tong(n - 1);
}

int main(){
int n; scanf("%d", &n);
printf("%lld", tong(n));
}
Tính n giai thừa bằng đệ quy.:
#include <stdio.h>
#include <math.h>
long long gt(int n){
if(n == 0) return 1;
return n * gt(n - 1);
}

int main(){
int n; scanf("%d", &n);
printf("%lld", gt(n));
}
Dãy số fibonacci là dãy số thỏa mãn : F1=0, F2=1, Fn=Fn-1+Fn-2. Hãy tìm số Fibonacci thứ n sử
dụng đệ quy. Độ phức tạp của code đệ quy là O(1.618^n) không thể áp dụng được với n lớn.:
#include <stdio.h>
#include <math.h>
int fibo(int n){
if(n == 1 || n == 2) return n-1;
return fibo(n - 1) + fibo(n - 2);
}

int main(){
int n; scanf("%d", &n);
printf("%d", fibo(n));
}
Cho 2 số nguyên dương N và K. Hãy tính tổ hợp chập K của N. Tiện thể các bạn ôn lại một vài
tính chất của tổ hợp chập K của N nhé.:
#include <stdio.h>
#include <math.h>
//to hop chap k cua n co: n = 1 khi k = 0 or k = n; k - 1 = k(trong kCn)
int tohop(int n, int k){
if(k == 0 || n == k) return 1;
return tohop(n - 1, k - 1) + tohop(n - 1, k);
}
int main(){
int n, k; scanf("%d %d", &n, &k);
printf("%d", tohop(n, k));
}
Cho 2 số a và b, hãy tính ước chung lớn nhất và bội chung nhỏ nhất của 2 số a và b. Trong đó
hàm UCLN sử dụng đệ quy để tính.:
#include <stdio.h>
#include <math.h>
#define ll long long
//dung ct ucln = (b, a % b) va th dau ucln = a khi b == 0
// bcnn = (a*b) // ucln
ll gcd(int a, int b){
if(b == 0) return a;
return gcd(b, a % b);
}
ll lcm (int a, int b){
return a / gcd(a, b) * b; // chia truoc de tranh tran
}
int main(){
ll a, b; scanf("%lld %lld", &a, &b);
printf("%lld %lld", gcd(a, b), lcm(a, b));
}

Tính tổng S(n) = 1/1 + 1/2 + 1/3 + ... + 1/n bằng đệ quy.:
double tongtp(int n){
if(n == 1) return 1;
return 1.0/n + tongtp(n - 1);
//tongtp() la phan de quy goi lai 1/n-1
}
Cho một số nguyên không âm N, hãy in ra dạng biểu diễn nhị phân của số N.:
#include <stdio.h>
#include <math.h>
void dq(long long n){
if(n < 2) printf("%lld", n);
else{
dq(n / 2);
printf("%lld", n % 2);
}
}
int main(){
long long n; scanf("%lld", &n);
dq(n);
}
Cho một số nguyên không âm N, hãy in ra dạng biểu diễn của N dưới hệ 16.:
#include <stdio.h>
#include <math.h>
// doi sang he 16 : dung n + 55(de doi qua ma asci in hoa)
void dq(long long n){
if(n < 16) {
if(n <= 9) printf("%d", n);
else printf("%c", n + 55);
}
else{
//dung bien r tim phan du cung theo ma asci
dq(n / 16);
int r = n % 16;
if(r <= 9) printf("%d", r);
else printf("%c", r + 55);
}
}
int main(){
long long n; scanf("%lld", &n);
dq(n);
}
Cho một số nguyên không âm N, hãy tính tổng chữ số của N sử dụng kỹ thuật đệ quy.:
#include <stdio.h>
#include <math.h>
#define ll long long
//goi ham tong chu so
ll tcs(ll n){
if(n < 10) return n;
else {
return n % 10 + tcs(n / 10);
}
}

int main(){
ll n; scanf("%lld", &n);
printf("%d", tcs(n));
}
Cho một số nguyên không âm N, hãy đếm số lượng chữ số của N.:
#include <stdio.h>
#include <math.h>
#define ll long long
//goi ham dem chu so
ll dcs(ll n){
int cnt = 0;
if(n < 10) return 1; // hang donvi tra ve 1
else {
return ++cnt + dcs(n / 10);
}
}
int main(){
ll n; scanf("%lld", &n);
printf("%d", dcs(n));
}

Cho một số nguyên không âm N, hãy in ra chữ số đầu tiên của N.:
#include <stdio.h>
#include <math.h>
#define ll long long
//goi ham in chu so
ll ics(ll n){
if(n < 10) return n;
else return ics(n / 10);// khi n = 1 vao vong if return dap an
}
int main(){
ll n; scanf("%lld", &n);
printf("%d", ics(n));
}
Cho một số nguyên không âm N, hãy in ra chữ số lớn nhất và chữ số nhỏ nhất của N.:
#include <stdio.h>
#include <math.h>
#define ll long long
// goi ham tim so nho nhat
int mindigit(ll n){
if(n < 10) return n;
return fmin(n % 10, mindigit(n / 10));
}

int maxdigit(ll n){


if(n < 10) return n;
return fmax(n % 10, maxdigit(n / 10));
}

int main (){


ll n; scanf("%lld", &n);
printf("%d %d", maxdigit(n), mindigit(n));
return 0;
}
Cho một số nguyên không âm N, hãy in ra N theo thứ tự các chữ số từ trái qua phải và từ phải
qua trái. Chú ý phải sử dụng hàm đệ quy cho cả 2 yêu cầu.:
#include <stdio.h>
#include <math.h>
#define ll long long
//in1 la trai qua phai
void in1(ll n){
if(n < 10) printf("%d ", n);
else{
printf("%d ", n % 10);
in1(n / 10);
}
}
//in2 la phai qua trai
void in2(ll n){
if(n < 10) printf("%d ",n);
else{
in2(n / 10);
printf("%d ",n % 10);
}
}
int main (){
ll n; scanf("%lld", &n);
in2(n);
printf("\n");
in1(n);
}

Cho số nguyên không âm N, hãy tính tổng các chữ số chẵn, tổng các chữ số lẻ của N.:
#include <stdio.h>
#include <math.h>
#define ll long long
int tongchan(ll n){
if(n < 10){
if(n % 2 == 0) return n;
return 0;
}
else{
if(n % 10 % 2 == 0) return n % 10 + tongchan(n / 10);
else return tongchan(n / 10);
}
}

int tongle(ll n){


if(n < 10){
if(n % 2 == 0) return 0;
return n;
}
else{
if(n % 10 % 2 == 1) return n % 10 + tongle(n / 10);
else return tongle(n / 10);
}
}

int main (){


ll n; scanf("%lld", &n);
printf("%d\n%d", tongchan(n), tongle(n));
}

Cho số nguyên không âm N, hãy kiểm tra xem tất cả các chữ số của N có phải đều là số chẵn hay
không?:
#include <stdio.h>
#include <math.h>
#define ll long long
int check(ll n){
if(n < 10){
if(n % 2 == 0) return 1;
return 0;
}
else{
if(n % 10 % 2 == 1) return 0;
else return check(n / 10);
}
}

int main (){


ll n; scanf("%lld", &n);
if(check(n) == 1) printf("YES");
else printf("NO");
}
Cho số nguyên dương N. Bạn được thực hiện 3 thao tác sau đây: 1. Lấy N chia cho 2 nếu N chia
hết cho 2. 2. Lấy N chia hết cho 3 nếu N chia hết cho 3. 3. Giảm N đi 1 đơn vị. Hãy đếm số thao
tác ít nhất để biến đổi N về 1.
Cho một mảng số nguyên A gồm N phần tử, hãy kiểm tra xem mảng có đối xứng hay không
bằng cách sử dụng hàm đệ quy.
Cho một mảng số nguyên A gồm N phần tử, hãy in ra mảng theo thứ tự từ trái qua phải và từ
phải qua trái bằng đệ quy.
Cho một mảng số nguyên A gồm N phần tử, hãy kiểm tra xem mảng có phải toàn số chẵn hay
không?
Cho một mảng số nguyên A gồm N phần tử, hãy kiểm tra xem mảng có phải là mảng tăng dần
hay không, mảng tăng dần được định nghĩa là mảng mà phần tử hiện tại luôn lớn hơn các phần
tử đứng trước nó.
Cho một mảng số nguyên A gồm N phần tử đã được sắp xếp giảm dần, hãy viết hàm tìm kiếm
nhị phân bằng đệ quy để kiểm tra xem phần tử X có nằm trong mảng hay không.

You might also like