目录
- 知识点讲解
- 练习题
- 附加题
【递推思想简介】
递推,意思就是用已经有的信息一点点推出想要知道的信息。显然,如果我们用人脑去模拟一个递推算法,是比较简单的,因为“根据已有信息推出未知信息”是我们常用的思考方式,符合直觉。如果用电脑运行递推算法,我们应该考虑使用循环。我们可以在循环的过程中使用数组和临时变量记录下来每一步递推的过程和结果。
例子:裴波拉切数列。
【递推思想】
根据已有的东西一点点地推出未知的东西。
【使用递推解题三步骤】
1、数学建模
2、找出递推式和初始条件
3、写出代码。
为了美化环境,市长提出全民种花活动:第一户种1盆,第二户种1盆,第三户种2盆,第四户种3盆,第五户种5盆,第六户种8盆……以此类推,请问第n户要种多少盆?
输入格式
1个整数n,代表第几户(n<90)。
输出格式
1个整数,代表第n户要种花的盆数。
输入/输出例子1
输入:
10
输出:
55
样例解释
无
#include<bits/stdc++.h>
using namespace std;
int n,a[100],s;
int main(){
cin>>n;
a[1]=1,a[2]=1;
for(int i=3;i<=n;i++)
{
a[i]=a[i-1]+a[i-2];
s=a[i];
}
cout<<s;
return 0;
}
一列数的前几个数分别为0、1、1、2、4、7、13、……,请你根据这个规律编程输出此数列的第n项的数值。
输入格式
一个整数n(2≤n≤40),表示求第n项。
输出格式
一个整数m,表示第n项的数值。
输入/输出例子1
输入:10
输出:81
样例解释
无
#include<bits/stdc++.h>
using namespace std;
int n,a[100],s;
int main(){
cin>>n;
a[1]=0,a[2]=1,a[3]=1;
for(int i=4;i<=n;i++)
{
a[i]=a[i-1]+a[i-2]+a[i-3];
}
cout<<a[n];
return 0;
}
数学课上,老师在黑板上写下了如下的一串数:
1、2、3、1、4、3、7、4、11、7……
请你根据它的规律求出第N项的值?
细心的明明发现这个数列的规律是:奇数项等于前一个奇数项加前一个偶数项,偶数项等于前一个奇数项减前一个偶数项。
由于计算结果有点大,明明怕算错,你能帮他算出来吗?
输入格式
输入只有一个数N(3<=N<=100)
输出格式
输出数列中第N个数的值。
输入/输出例子1
输入:6
输出:3
样例解释
无
#include<bits/stdc++.h>
using namespace std;
int n,a[105];
int main(){
cin>>n;
a[1]=1,a[2]=2;
for(int i=3;i<=n;i++)
{
if(i%2==1) a[i]=a[i-1]+a[i-2];
else a[i]=a[i-1]-a[i-2];
}
cout<<a[n];
return 0;
}
给出一个序列:10,20,11,19,12,18,......根据序列的规律,第N项是什么?
输入格式
一个整数N。
输出格式
一个整数
输入/输出例子1
输入:
7
输出:
13
样例解释
【数据范围】
1 <= N <= 100000。
#include<bits/stdc++.h>
using namespace std;
long long n,s=10,a[100005];
int main(){
cin>>n;
a[1]=10;
for(int i=2;i<=n;i++)
{
if(i%2==0) a[i]=a[i-1]+s;
else a[i]=a[i-1]-s;
s--;
}
cout<<a[n];
return 0;
}
琳琳刚学会使用数组,老师就给了他一个这样的问题:有两个数组 A[1..n]和 B[1..n]他们之间存在数学关系式是: B[i] = ( A[1] + A[2]+...A[i])/i(整除) ,其中 1 <= i <= n。
例如: A 数组是: 1, 3, 2, 6, 8。
那么 B 数组是:
可以算出B数组是: 1,2,2,3,4
输入格式
输入数据有两行:
第一行,一个整数 n。 1 <= n <= 100。
第二行,包含 n 个整数,第 i 个整数是 B[i]。 1 <= B[i] <= 10^9。
输出格式
输出数据仅一行,共 n 个整数,每个数之间用一个空格分开,第 i 个整数表示 A[i]。
数据保证 A[i]一定是整数,而且保证 1<=A[i]<=10^9。
输入/输出例子1
输入:
4
3 2 3 5
输出:
3 1 5 11
样例解释
无
#include<bits/stdc++.h>
using namespace std;
long long n,a[105],b[105],c[105];
int main(){
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>b[i];
c[i]=b[i]*i,a[i]=c[i]-c[i-1];
}
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
给出一个序列: 10,20,11,19,12,18,......根据序列的规律, 第 N 项是什么?
输入格式
一个整数 N。
输出格式
一个整数 。
输入/输出例子1
输入:
7
输出:
13
样例解释
1 <= N <= 3e12。
#include<bits/stdc++.h>
using namespace std;
long long n;
int main(){
cin>>n;
if(n%2==0) cout<<20-n/2+1;
else cout<<10+n/2;
return 0;
}
斐波那契数列是非常出名的数列,它的公式是这样的:
1、 f[0] = 0;
2、 f[1] = 1;
3、 对于任意i>=2,都有f[i] = f[i-1] + f[i-2]。
于是,产生的斐波那契数列就是:0,1,1,2,3,5,8,13,21,34,......
现在给出一个正整数N,你要找出一个最小的整数X,同时满足如下两个条件:
1、 X >= 0。
2、 N+X是斐波那契数列中的某一个数,或者N-X是斐波那契数列中的某一个数。
请输出满足条件的最小的X。
输入格式
一行,一个整数N。 1 <= N <= 1000000。
输出格式
一个满足条件的最小的X。
输入/输出例子1
输入:15
输出:2
输入/输出例子2
输入:19
输出:2
输入/输出例子3
输入:8
输出:0
样例解释
样例1 因为15-2=13,而13是斐波那契数列的其中一个数。
样例2 因为19+2=21,而21是斐波那契数列的其中一个数。
样例3 因为8本身已经是斐波那契数列的一个数了。
#include<bits/stdc++.h>
using namespace std;
long long n,a[100001],minn=1000000;
int main(){
cin>>n;
a[0]=0,a[1]=1;
for(int i=2;i<=100000;i++)
{
a[i]=a[i-1]+a[i-2];
minn=min(abs(n-a[i]),minn);
}
minn=min(n-0,minn);
cout<<minn;
return 0;
}
- 附加题
- 第1题 数的计数
要求找出具有下列性质数的个数(包含输入的自然数n)。先输入一个自然数n(n≤1000), 然后对此自然数按照如下方法进行处理:
(1)不作任何处理;
(2)在它的左边加上一个自然数,但该自然数不能超过原数的一半;
(3)加上数后,继续按此规则进行处理,直到不能再加自然数为止。
输入格式
一行一个自然数,表示n。
输出格式
一行一个数,表示满足条件的数的总个数。
输入/输出例子1
输入:
6
输出:
6
样例解释
满足条件的数位6,16,26,126,36,136。答案保证在int范围。
#include<bits/stdc++.h> using namespace std; int a[1005],n; int main(){ cin>>n; for(int i=1;i<=n;i++) { a[i]=1; for(int j=1;j<=i/2;j++) a[i]+=a[j]; } cout<<a[n]; return 0; }
第2题 跳格子星期天,小明做完作业就约同学出去运动。
他们来到了一片空地,画了N个连续的方格,每个方格上随机填上了一个数字,大家从第一个格子开始,每次可以向后跳不超过当前格子上的数的步数,大家开始就此比赛,看谁跳到最后一个格子的步数最少。
作为领队的小明显然是想获得胜利的,所以他希望你能帮助他。
输入格式
输入第一行包含一个整数N(N<=5000),表示画的格子的个数。
第二行包含N整数,表示每个格子上的数Ai (Ai<=1000)。
输出格式
输出一行,表示跳的最少步数。
输入/输出例子1
输入:
5
2 3 1 1 1
输出:
2
样例解释
无
#include<bits/stdc++.h> using namespace std; int n,a[5005],b[5005]; int main(){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i],b[i]=INT_MAX; b[1]=0; for(int i=2;i<=n;i++) for(int j=1;j<i;j++) if(a[j]+j>=i)b[i]=min(b[i],b[j]+1); cout<<b[n]; return 0; }
第3题 2的幂数小明开始学习二进制转化到十进制,其中要用到2的幂(2的3次幂就是3个2相乘),他觉得这个很有意思。既然通过2的幂相加可以得到十位数,那么反过来,一个十进制数是否可以通过若干个2的幂相加得到呢?
小明开始研究起来,他先列出了所有2的幂:1,2,4,8,16,32,64……。
4=1+1+1+1
4=1+1+2
4=2+2
4=44共有4种方法
7=1+1+1+1+1+1+1
7=1+1+1+1+1+2
7= 1+1+1+2+2
7=1+1+1+4
7=1+2+2+2
7= 1+2+4
7共有6种方法。另外,1+2+4和2+1+4认为是同一个等式,因为它们的组成相同。
现在小明想要知道,给出一个十进制数,可以写出多少种,用若干个2的幂数相加的式子。输入格式
第一行包含1个正整数n, 1<=n<=1000。
输出格式
共1行,n能用2的幂数相加的不同式子的种数。
输入/输出例子1
输入:
7
输出:
6
样例解释
无
#include<bits/stdc++.h> using namespace std; int a[1005],n; int main(){ cin>>n; for(int i=1;i<=n;i++) { a[i]=1; for(int j=1;j<=i/2;j++) a[i]+=a[j]; } cout<<a[n]; return 0; }