递推和递归
1.什么是递推和递归
递归:从已知问题的结果出发,用迭代表达式逐步推算出问题的开始的条件,即顺推法的逆过程,称为递归。
递推:从已知道的若干项出发,利用递推关系依次推算出后面的未知项的方法,我们称为递推算法。
2.实用代码
递归
int f(传入数值) {
if (终止条件) return 最小子问题解;
return f(缩小规模);
}
递推
for(int i=1;i<=递推次数;i++){
递推式;
}
3.举个例子
递推:铺砖1
题目描述
有2*n的一个长方形方格道路,只有一种1*2的砖去铺,总共有多少种铺法呢?
输入格式
一行,一个n(0≤n≤45)
输出格式
一行,一个数(总共有多少种铺法)
样例输入
3
样例输出
3
思路及题解
凡是递推,几乎都要从最后倒推.
本题考虑一下最后一块砖的情况
如果我竖着摆1*2,正好,所以a(1)=1.
横着摆,那么下面还要摆一块,so,a(2)=2.
其实不摆也是一种情况,所以a(0)=1
代码奉上(仅供参考):
#include<iostream>
int b;
using namespace std;
int main(){
int a[50];
a[0]=1;
a[1]=1;
a[2]=2;
cin>>b;
for(int i=3;i<=b;i++){
a[i]=a[i-1]+a[i-2];
}
cout<<a[b];
}
递推:递归函数
题目描述
对于一个递归函数w(a, b, c).
如果 a <= 0 or b <= 0 or c <= 0 就返回值1.
如果 a > 20 or b > 20 or c > 20就返回 w(20,20,20).
如果 a < b 并且b < c 就返回 w(a, b, c − 1) + w(a, b − 1, c − 1) − w(a, b − 1, c).
其它别的情况就返回 w(a − 1, b, c) + w(a − 1, b − 1, c) + w(a − 1, b, c − 1) − w(a −1, b - 1, c - 1)
这是个简单的递归函数,但实现起来可能会有些问题。
输入格式
会有若干行.每行三个数,表示a, b, c.并以−1, −1, −1结束
输出格式
输出若干行
样例输入
1 1 1
2 2 2
-1 -1 -1
样例输出
w(1,1,1)=2
w(2,2,2)=4
思路及题解
这题直接按出题人说的做,肯定要完蛋.
想一想,一个怎么复杂的递归,不用记忆化来做,肯定要超时.
我们可以开一个 bool 类型的三维的数组,来标记一下这个分支进行过没有
注意:无限输入!EOF!
代码奉上(仅供参考):
#include<iostream>
#include<cstdio>
using namespace std;
long long q[21][21][21];
long long x,y,z;
long long w(long long a,long long b,long long c){
if (a<=0 or b<=0 or c<=0) {
return 1;
}
if (a>20 or b>20 or c>20){
return w(20,20,20);
}
if (q[a][b][c]!=1){
return q[a][b][c];
}
if (a<b and b<c){
q[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
return q[a][b][c];
}
return q[a][b][c]=w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1);
}
int main(){
for (int i=0;i<=20;i++){
for (int j=0;j<=20;j++){
for (int k=0;k<=20;k++){
q[i][j][k]=1;
}
}
}
while(cin>>x>>y>>z){
if (x==-1 and y==-1 and z==-1){
break;
}
cout<<"w("<<x<<","<<y<<","<<z<<")="<<w(x,y,z)<<endl;
}
return 0;
}

浙公网安备 33010602011771号