一般而言,递推是一种顺序递推的数学关系模型,好比通项公式。在数值计算的过程之中,只需要知道递推的边界值,也就是最开始的原始数值。
解决递推问题有三个重点:
1、建立正确的递推关系式。
2、分析递推关系式的性质。
3、根据递推关系式编程求解。
递推和递归的不同点:
1、算法的过程不同。递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法。递归算法在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。递归式方法可以被用于解决很多的计算机科学问题,因此它是计算机科学中十分重要的一个概念。
2、递推与递归的比较相对于递归算法,递推算法免除了数据进出栈的过程,也就是说,不需要函数不断的向边界值靠拢,而直接从边界出发,直到求出函数值。
3、两种算法用途不同。递归算法绝大多数编程语言支持函数的自调用,在这些语言中函数可以通过调用自身来进行递归。计算理论可以证明递归的作用可以完全取代循环,因此在很多函数编程语言中习惯用递归来实现循环。而递推算法是给定一个数的序列x₀,x₁,…,xₙ,…若存在整数n0,使当n>n₀时,可以用符号将xₙ与其前面的某些项xᵢ(0<i<n)联系起来,这样的式子就叫做递推关系。
介绍完递推,我们搞点题来做做:
一、斐波那契数列
斐波那契数中的第一个数值1和第二个数值1,知道这两个数值之后再根据最终的目标来计算,即第三条数值是第一条数值和第二条数值的相加,而第四条数值是第二条数值和第三条数值的相加,以此类推,直到求出第n条数值,也就是目标值为终点。输入N,可输出斐波那契数列的第N个数。这题我们用递归也做过(看我上篇文章)。用递推做会简单一些:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,f[100000];
cin>>n;
f[1]=f[2]=1;
for(int i=3;i<=n;i++){
f[i]=f[i-1]+f[i-2];
}
cout<<f[n];
return 0;
}
二、Pell数列
Pell数列a1, a2, a3, ...的定义是这样的,a1=1, a2=2, ... , an=2*(an-1)+(an-2) (n > 2)。
给出一个正整数n,要求Pell数列的第n项模上32767是多少。
思路:第一项是1,第二项是2,第三项是2*第二项+第一项,所以递推关系式为:f[i]=f[i-1]*2+f[i-2];,最后输出。上代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,f[100000];
cin>>n;
f[1]=1;
f[2]=2;
for(int i=3;i<=n;i++){
f[i]=f[i-1]*2+f[i-2];
}
cout<<f[n];
return 0;
}
三、走楼梯
输入n,表示楼梯有n阶台阶,上楼时可以一步上1阶,也可以一步上2阶,也可以一步上3阶,编程计算共有多少种不同的走法。
思路:通过每次可行的步数,列出递推关系式:f[i]=f[i-1]+f[i-2]+f[i-3];,所以得先把前三项算出来,分别是1,2,4。上代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,f[100000];
cin>>n;
f[1]=1;
f[2]=2;
f[3]=4;
for(int i=4;i<=n;i++){
f[i]=f[i-1]+f[i-2]+f[i-3];
}
cout<<f[n];
return 0;
}
好了,递推的讲解到这里就结束了,拜拜~~~