递推,顾名思义,就是从问题出发逐步推到已知条件的过程。递推算法的首要问题就是要先找到递推关系式,我们根据例题来看一下:
例题1:
菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。
给出一个正整数a(a<100),要求菲波那契数列中第a个数是多少。
样例输入:6
样例输出:8
思路:我们先来解读一下题意,我们知道斐波那契数列是1,1,2,3,5,8,13……他的每一个数都等于前两个数之和,然后我们就可以看一下样例输入,样例输入是6,根据上面的数列,我们很容易看出febnaqi数列的第六位是8了。
那么题目理解了,我们就可以看思路了:我们知道,如果定义3个变量让他们增加的话,非常的麻烦。于是我们可以用数组模拟febnaqi数列,遍历数组,挨个往上推算,最后算到数组的第n项不就可以了?如果你还不明白,可以借助Excll来理解一下:
可是,重点来了,我们怎么知道数组的第几项是几呢?这就要用到递推的精髓:递推关系式
我们不难发现,这里的febnaqi数列的第一项是1,第二项是1,以后的每一项都等于他的前两项之和,然后我们就可以推出递推公式:a[i]=a[i-1]+a[i-2],就可以进行计算了。
那你也许还有疑惑,为什么要把a[1]和a[2]赋值为1呢?因为递推递推,他是需要开始的数据才能推演的,如果开始没有数就会无法推演。因为febnaqi数列的第一项和第二项都为1,所以这两个1就相当于开始数据,递推就是在开始数据的基础上进行推演的。
好了,知道了递推关系式,我们就可以把过程编出来了,首先我们要定义一个变量n和用于推演的a数组,然后输入n:
int n,a[101];
cin>>n;
然后,我们要把a数组的第1项和第2项赋值为1:
a[1]=1;
a[2]=1;
接着到了最关键的一步,利用递推关系式给数组赋值:
for(int i=3;i<=n;i++){
a[i]=a[i-1]+a[i-2];
}
最后输出a数组的第n项就可以了。下面是完整代码:
#include<iostream>
using namespace std;
int main(){
int n,a[101];
cin>>n;
a[1]=1;
a[2]=1;
for(int i=3;i<=n;i++){
a[i]=a[i-1]+a[i-2];
}
cout<<a[n];
return 0;
}
关于递推,有一些题型是让你自己找数字中的规律,进而找出递推关系式,而还有些题是告诉你了递推关系式,让你自己去地推。但不管怎样,碰到递推的题一定要首先找到递推关系式,再解答。