一本通 递归专栏

A 斐波那切数列(fbi)

【问题描述】

斐波那切数列0,1,1,2,3,5,8,13,21,34,55……从第三项起,每一项都是紧挨着的前两项的和。写出计算斐波那切数列的任意一个数据项递归程序。

【输入形式】

输入所求的项数。

【输出形式】

输出数据项的值。

【样例输入】

10

【样例输出】

34

#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
# include<iostream>
# include<algorithm>
# include<cmath>
# include<cstdio>
# include<set>
# include<stack>
# include<queue> 
# include<map>
# include<string>
# include<cstring> 
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int > PII; 
const int mod=1e9+7;
const int MAX=2e6+10;
const int Time=86400;
const int X=131;
const int inf=0x3f3f3f3f;
const double PI = 1e-4;
double pai = 3.14159265358979323846; 

int n, f[MAX];

int main(){  
    std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n;
    f[1] = 0; f[2] = 1; f[3] = 1;
    for(int i = 4; i <= n ; i++)
     f[i] = f[i - 1] + f[i - 2];
    cout<<f[n];
	return 0;
}

B 倒序数(num)

【问题描述】

用递归算法写程序,输入一个非负整数,输出这个数的倒序数。

【输入形式】

输入一个非负整数(保证个位不为零)。

【输出形式】

输出倒序结果。

【样例输入】

123
【样例输出】

321

#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
# include<iostream>
# include<algorithm>
# include<cmath>
# include<cstdio>
# include<set>
# include<stack>
# include<queue> 
# include<map>
# include<string>
# include<cstring> 
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int > PII; 
const int mod=1e9+7;
const int MAX=2e6+10;
const int Time=86400;
const int X=131;
const int inf=0x3f3f3f3f;
const double PI = 1e-4;
double pai = 3.14159265358979323846; 

ll n , sum;
void fun(ll x){
	 cout<<x%10;
	 if(x>=10) fun(x/10);
}
int main(){  
    std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n ;
    
    fun(n);
	 
	return 0;
}

C 十进制转换成八进制(change)

【问题描述】

用递归算法,把任一给定的十进制正整数转换成八进制数输出。

【输入形式】

输入一个正整数,表示需要转换的十进制数。

【输出形式】

输出一个正整数,表示转换之后的八进制的数。

【样例输入】

15

【样例输出】

17

#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
# include<iostream>
# include<algorithm>
# include<cmath>
# include<cstdio>
# include<set>
# include<stack>
# include<queue> 
# include<map>
# include<string>
# include<cstring> 
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int > PII; 
const int mod=1e9+7;
const int MAX=2e6+10;
const int Time=86400;
const int X=131;
const int inf=0x3f3f3f3f;
const double PI = 1e-4;
double pai = 3.14159265358979323846; 

ll n ;
int a[MAX],j;
int main(){  
    std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n;
    while(n){
    	a[j++] = n % 8;
    	n = n / 8;
	}
	for(int i = j - 1 ; i >= 0 ; i -- )
	 cout<<a[i];
	return 0;
}

D 求N!的值(ni)

【问题描述】

用递归算法,求N!的精确值(N以一般整数输入)。

【样例输入】

10

【样例输出】

10!=3628800

#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
# include<iostream>
# include<algorithm>
# include<cmath>
# include<cstdio>
# include<set>
# include<stack>
# include<queue> 
# include<map>
# include<string>
# include<cstring> 
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int > PII; 
const int mod=1e9+7;
const int MAX=2e6+10;
const int Time=86400;
const int X=131;
const int inf=0x3f3f3f3f;
const double PI = 1e-4;
double pai = 3.14159265358979323846; 

int n ;
double fun(int i)
{
    double sum ;
	if(i == 1)	sum = 1;
	 else       sum = i * fun(i - 1);     
	return sum;
} 

int main(){  
    std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n;
    
    printf("%d!=%lf",n,fun(n));
	return 0;
}

E 求最大公约数(gcdmax)

【问题描述】

用递归方法求两个数 m 和 n 的最大公约数。(m>0,n>0)

【输入形式】

输入二个数,即m 和 n 的值。

【输出形式】

输出最大公约数。

【样例输入】

8 6

【样例输出】

gcd=2

#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
# include<iostream>
# include<algorithm>
# include<cmath>
# include<cstdio>
# include<set>
# include<stack>
# include<queue> 
# include<map>
# include<string>
# include<cstring> 
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int > PII; 
const int mod=1e9+7;
const int MAX=2e6+10;
const int Time=86400;
const int X=131;
const int inf=0x3f3f3f3f;
const double PI = 1e-4;
double pai = 3.14159265358979323846; 

ll n , m ;

int main(){  
    std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m;
    printf("gcd=%lld",__gcd(n,m));
	return 0;
}

F 双色Hanoi塔问题(hanoi)1

【问题描述】

设A、B、C是3 个塔座。开始时,在塔座A 上有一叠共n 个圆盘,这些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号为1,2,……,n,奇数号圆盘着蓝色,偶数号圆盘着红色,如图所示。现要求将塔座A 上的这一叠圆盘移到塔座B 上,并仍按同样顺序叠置。在移动圆盘时应遵守以下移动规则:

规则(1):每次只能移动1 个圆盘;

规则(2):任何时刻都不允许将较大的圆盘压在较小的圆盘之上;

规则(3):任何时刻都不允许将同色圆盘叠在一起;

规则(4):在满足移动规则(1)-(3)的前提下,可将圆盘移至A,B,C 中任一塔座上。

在这里插入图片描述

试设计一个算法,用最少的移动次数将塔座A 上的n个圆盘移到塔座B 上,并仍按同样顺序叠置。

对于给定的正整数n,编程计算最优移动方案。

【输入形式】

第1 行是给定的正整数n。

【输出形式】

每一行由一个正整数k和2个字符c1和c2组成,表示将第k个圆盘从塔座c1移到塔座c2上。

【样例输入】

3
【样例输出】

1 A B

2 A C

1 B C

3 A B

1 C A

2 C B

1 A B

#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
# include<iostream>
# include<algorithm>
# include<cmath>
# include<cstdio>
# include<set>
# include<stack>
# include<queue> 
# include<map>
# include<string>
# include<cstring> 
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int > PII; 
const int mod=1e9+7;
const int MAX=2e6+10;
const int Time=86400;
const int X=131;
const int inf=0x3f3f3f3f;
const double PI = 1e-4;
double pai = 3.14159265358979323846; 

int n , k ;

void fun(int n, char a , char c, char b){
	if(n == 0 ) return ;
      fun(n - 1,a,b,c);
      cout<<n<<" "<<a<<" "<<b<<"\n";
      fun(n - 1,c,a,b);
}
int main(){  
   std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n ;
    fun(n,'A','C','B');
    
	return 0;
}

G 背包问题

【问题描述】

简单的背包问题。设有一个背包,可以放入的重量为s。现有n件物品,重量分别为w1,w2…,wn,(1≤i≤n)均为正整数,从n件物品中挑选若干件,使得放入背包的重量之和正好为s。找到一组解即可。

【输入形式】

第一行是物品总件数和背包的载重量,第二行为各物品的重量。

【输出形式】

若找到一组解,则输出"yes"。

若没有,则输出“no”.

【样例输入】

5 10

1 2 3 4 5

【样例输出】

yes

#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
# include<iostream>
# include<algorithm>
# include<cmath>
# include<cstdio>
# include<set>
# include<stack>
# include<queue> 
# include<map>
# include<string>
# include<cstring> 
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int > PII; 
const int mod=1e9+7;
const int MAX=2e6+10;
const int Time=86400;
const int X=131;
const int inf=0x3f3f3f3f;
const double PI = 1e-4;
double pai = 3.14159265358979323846; 

int n ,m ,v,dp[MAX]; 
int main(){  
   std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m ;
    for(int i = 1 ; i <= n ; i ++ ){
    	 cin >> v;
    	 for(int j = m ; j >= v ; j -- )
    	  dp[j] = max(dp[j] , dp[j - v] + v);
	}
	if(dp[m] == m) cout<<"yes";
	 else cout<<"no";
	return 0;
}

H 集合的划分

【问题描述】

在这里插入图片描述

【输入形式】
给出n和k。

【输出形式】

n个元素a1,a2,……,an 放入k个无标号盒子中去的划分数S(n,k)。

【样例输入】

10 6
【样例输出】

22827

#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
# include<iostream>
# include<algorithm>
# include<cmath>
# include<cstdio>
# include<set>
# include<stack>
# include<queue> 
# include<map>
# include<string>
# include<cstring> 
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int > PII; 
const int mod=1e9+7;
const int MAX=2e6+10;
const int Time=86400;
const int X=131;
const int inf=0x3f3f3f3f;
const double PI = 1e-4;
double pai = 3.14159265358979323846; 

int n , k ;
int fun(int n, int k){
	if(k==0 || n < k) return 0;
	if(n == k || k == 1) return 1;
	return fun(n - 1,k - 1) + k*fun(n-1,k);
}
int main(){  
   std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> k;
    cout<<fun(n,k);
    
	return 0;
}

I 数的计数(Noip2001)

【问题描述】

我们要求找出具有下列性质数的个数(包括输入的自然数n)。先输入一个自然数n(n≤1000),然后对此自然数按照如下方法进行处理:

不作任何处理;

在它的左边加上一个自然数,但该自然数不能超过原数的一半;

加上数后,继续按此规则进行处理,直到不能再加自然数为止。

【输入形式】

自然数n(n≤1000)。

【输出形式】

满足条件的数。

【样例输入】

6
【样例输出】

6
【样例说明】

满足样例条件的数为:
6
16
26
126
36
136

#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
# include<iostream>
# include<algorithm>
# include<cmath>
# include<cstdio>
# include<set>
# include<stack>
# include<queue> 
# include<map>
# include<string>
# include<cstring> 
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int > PII; 
const int mod=1e9+7;
const int MAX=2e6+10;
const int Time=86400;
const int X=131;
const int inf=0x3f3f3f3f;
const double PI = 1e-4;
double pai = 3.14159265358979323846; 

int x,y,z,n;
ll dp[MAX];
int main(){  
   std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n;
    for(int i = 1; i <= n ; i ++ ){
    	 dp[i] = 1;
    	 for(int j = i/2 ; j >= 1 ; j -- )
    	  dp[i] += dp[j];
    	
	}
	cout<<dp[n];
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值