算法入门——递推

主要思想:

通过已知的条件(已知结果),利用特定的关系,逐步递推(顺推/逆推),直到有解或者无解。

主要分为两种:顺推,从已知条件出发,直至推出解。

逆推,从已知结果出发,直至推出解。

需要注意的:每一递推结果,都是下一步递推的条件。

顺推:

斐波那契数列  F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)

实例

兔子的总数有多少?

一对兔子,每月能生一对,而每对兔子3个月后可以生育。求12个月后共有多少兔子。

#include<stdio.h>
#define NUM 13
void main(){
 int i;
 long fid[NUM]={1,1};
 for(i=2;i<NUM;i++){
  fid[i]=fid[i-1]+fid[i-2];
 }
 for(i=0;i<NUM;i++){
  printf("%d月,兔子的总数%d\n",i,fid[i]);
 }
 getch();
} 

分析:首先,可以很明确的知道,这是一个顺推的问题。第一个月1对,第二个月1对,第三个月2对。。。一次次的递推。对于顺推的问题,主要的就是找到最初条件(1,1,2,3。。。)和特定关系(Fn=F(n-1)+F(n-2)(n>=2,n∈N*)),找到这些,然后根据问题的,进一步完善即可。

程序运行过程分析略。

逆推:

实例

该存多少钱?

要想在大学四年里的最后一个月取生活费1000元,期间每个月取1000元,从一开始,就得存多少钱。银行一年的利率为1.71%。

#include<stdio.h>
#define FETCH 1000 //每个月取1000元
#define RATE 0.0171 //银行的年利率
void main(){
 double year[49];//0-48个月
 int i;
 year[48]=(double)FETCH;
 for(i=47;i>0;i--){
  year[i]=(year[i+1]+FETCH)/(1+RATE/12);
 }
 for(i=48;i>0;i--){
  printf("%d月的本息和为%.2f\n",i,year[i]);
 }
 getch();
} 

分析:我们知道最后一个月即48月取的钱是1000元,那47月的本息和应该为1000/(1+0.0171/12)。在由47月的本息逆推46月的本息:(1000/(1+0.0171/12))
/ (1+0.0171/12),由此类推,直至1月为止。那么这就是一个典型的逆推问题。由结果出发,推出解。

程序运行过程分析略。

递推思想只是简单的算法入门,讲述的也都是一些很基本的东西,不过里面的思维值得慢慢体会和揣摩。在日常的生活中,我们都经常会不自觉的使用到递推的思想。把握知其中的本质:从一个结果,根据特定的条件,推出下一个结果。那么有些复杂的事,就会变得很简单。

时间: 2024-11-05 16:06:19

算法入门——递推的相关文章

滑动平均滤波算法(递推平均滤波法)

//滑动平均滤波算法(递推平均滤波法) //ADNum为获得的AD数 //GN为数组value_buf[]的元素个数.该函数主要被调用,利用参数的数组传值 const int GN = 12; int filterPtr = 0; bool isFirst = true; public float gSum = 0; float[] gbuf  = new float[GN]; float GlideFilterAD(float ADNum) { if (isFirst) { isFirst =

滑动平均滤波算法(递推平均滤波法)(转帖)

//滑动平均滤波算法(递推平均滤波法)--C语言版 int FilterI=0; //ADNum为获得的AD数 //n为数组value_buf[]的元素个数.该函数主要被调用,利用参数的数组传值 int GlideFilterAD(int value_buf[],int n,int ADNum) { int sum=0; value_buf[FilterI++]=ADNum; if(FilterI==n) FilterI=0; //先进先出,再求平均值 for(int count=0;count

数据结构与算法之递推算法 C++与PHP实现

数据结构是算法实现的基础,算法总是要依赖于某种数据结构来实现的.往往是在发展一种算法的时候,构建了适合于这种算法的数据结构.一种数据结构如果脱离了算法,也就没有存在的价值了. 算法的作用----解决任何一个实际问题,都不可避免地涉及到算法的问题,通过一定的算法,得到一个最优(或较优)的方案. 递推算法:递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法. 顺推法:从已知条件出发,逐步推算出要解决的问题的方法. 逆推法:从已知问题的结果出发,用迭代表达式逐步推算

算法学习——递推之超级素数

算法描述 超级素数定义: m位超级素数本身是素数 最高位开始,去掉一位为m-1位的素数-- 例: 103不是超级素数,去掉最高位的1之后为3,不是有个2位素数,137是一个三位超级素数,去掉最高位1之后为37,37是一个二位素数,去掉3之后为7,7也是一个素数 要求: 输入整数m(1 < m<=10),统计m位超级素数的个数,并输出其中最大的m位超级素数 算法思路 设置一个判断素数的方法 1位素数只有3个,3,5,7,我们可以推测,2位超级素数的个位数只能是3,5,7,没有其他的选择了,同理,

01python算法之递推

递推 1什么是递推?:根据已有节点的值,以及规律推出之后节点的值 2为什么要用递推:简单的解决有规矩事件 3怎么用?: 我们举个经典的例子: 如果1对兔子每月能生1对小兔子,而每对小兔在它出生后的第3个月就可以生1对小兔子,如果从1对初生的小兔子开始,1年后能繁殖多少兔子? def my1(max): a ,b,c ,i= 1,0,0 0 while i<max: c = c+b b = a a = c print a+b+c i+=1 方法:我们可以把兔子分为1个月大的,2个月大的,3个月大的

算法学习——递推1

递推,顾名思义,就是从一个小问题一步步推出问题的结果.在这个过程中,最主要的就是发现其中的递推关系. 给定一个数的序列H0,H1,…,Hn,…若存在整数n0,使当n>n0时,可以用等号(或大于号.小于号)将Hn与其前面的某些项Hi(0<i<n)联系起来,这样的式子就叫做递推关系. 来看一个问题:“未名湖边的烦恼” 问题描述: 每年冬天,北大未名湖上都是滑冰的好地方.北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩. 每天早上,租鞋窗口都会排起长龙,假设有还鞋的m

算法之——————递推的简单解释

1.顺推法:已知条件,逐步到结果,也叫迭代法,转转相除 2.逆推法:已知结果,推条件 步骤 1:确定迭代变量 2:建立迭代关系式 3:迭代过程的控制:1是计数型循环控制2,条件循环解决迭代次数无法确定的问题 关键:有迭代过程,循环结构 递推过程找迭代关系式,循环控制好迭代过程 顺推: 谷角猜想:编程打印出过程: 1 #include<stdio.h> 2 //#include<malloc> 3 #include<string.h> 4 int main() 5 { 6

算法之递推思想

一: 概念 通过已知条件,利用特定关系逐步递推,最终得到结果为止,核心就是不断的利用现有信息推导出新的东西. 二:分类 当然递推中有两种,"顺推"和"逆推" 顺推:从条件推出结果. 逆推:从结果推出条件. 三: 举例 <1> 顺推的例子 上过大学的应该都知道著名的"斐波那契"数列吧,说的是繁殖兔子的问题,题目我就大概说一下. 如果1对兔子每月能生1对小兔子,而每对小兔在它出生后的第3个月就可以生1对小兔子,如果从1对初生的小兔子开始,

蓝桥杯 算法提高 递推求值

思路: 矩阵快速幂. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 using namespace std; 5 6 typedef long long ll; 7 typedef vector<ll> vec; 8 typedef vector<vec> mat; 9 10 const int mod = 99999999; 11 12 mat mul(m