递推和递归

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;
}
posted @ 2021-03-02 13:37  cqbzgjx  阅读(157)  评论(0)    收藏  举报