算法之递推思想

一: 概念

通过已知条件,利用特定关系逐步递推,最终得到结果为止,核心就是不断的利用现有信息推导出新的东西。

二:分类

当然递推中有两种,“顺推”和“逆推“

顺推:从条件推出结果。

逆推:从结果推出条件。

三: 举例

<1> 顺推的例子

上过大学的应该都知道著名的“斐波那契”数列吧,说的是繁殖兔子的问题,题目我就大概说一下。

如果1对兔子每月能生1对小兔子,而每对小兔在它出生后的第3个月就可以生1对小兔子,如果从1对初生的小兔子开始,1年后能

繁殖多少兔子?

思路:其实这个问题我们可以将兔子划分为“1月大的兔子“,”2月大的兔子“,”3月大的兔子“。

① 初始时:            一对1月大小兔子,总数为1对。

② 第一个月:         1月大的小兔子变成2月大的兔子,总数还是1对。

③ 第二个月:         2月大的小兔子变成3月大的兔子,繁殖了一对小兔子,总数为2对。

④ 第三个月:         3月大的兔子tmd有生了一对小兔子,上个月1月大的小兔子变成了2月大的兔子,总数为3对。

......                    ......

F0=1

F1=1

F2=F0+F1

F3=F1+F2

......

Fn=Fn-2+Fn-1

大家看看,是不是体现了”递推“的核心思想,代码也很简单。

 1             int month = 12;
 2
 3             int[] fab = new int[month];
 4
 5             fab[0] = 1;
 6
 7             fab[1] = 1;
 8
 9             //从已知条件出发推出结果
10             for (int i = 2; i < month; i++)
11             {
12                 fab[i] = fab[i - 1] + fab[i - 2];
13             }
14
15             for (int i = 0; i < month; i++)
16             {
17                 Console.WriteLine("第{0}个月兔子为:{1}", i, fab[i]);
18             }

<2> 逆推的例子

这个一个关于存钱的问题,一个富二代给他儿子的四年大学生活存一笔钱,富三代每月只能取3k作为下个月的生活费,采用的是整存零取的方式,

年利率在1.71%,请问富二代需要一次性存入多少钱。

思路: 这个题目是我们知道了结果,需要逆推条件, 第48月富三代要连本带息的把3k一把取走,那么

第47月存款应为: (第48个月的存款+3000)/(1+0.0171/12(月));

第46月存款应为: (第47个月的存款+3000)/(1+0.0171/12(月));

.....                    .....

第1个月存款应为: (第2个月的存款+3000)/(1+0.0171/12(月));

 1   //银行取钱问题
 2             double[] month = new double[49];
 3
 4             ///最后一个月的连本带息是3000
 5             month[48] = 3000;
 6
 7             double rate = 0.0171;
 8
 9             //逆推
10             for (int i = 47; i > 0; i--)
11             {
12                 month[i] = (month[i + 1] + month[48]) / (1 + rate / 12);
13             }
14
15             for (int i = 48; i > 0; i--)
16             {
17                 Console.WriteLine("第{0}个月末本利合计:{1}", i, month[i]);
18             }

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-17 06:08:12

算法之递推思想的相关文章

十七、斐波那契数列 【递推思想(迭代思想)解决】

 递推思想本身并不跟函数有直接关系(虽然常常写在函数中). 其基本思路为: 为了解决一个"大"问题,根据现实逻辑,如果能够找到同类问题的一个"最小问题"的答案(通常是已知的),并且根据已知算法,又可以因此得到比最小问题"大一级"问题的答案. 而且,依次类推,又可以得到再大一级问题的答案,最终就可以得到"最大那个问题"(即要解决的问题)的答案. 可见,该思想的过程依赖与2个条件: 1,可知同类最小问题的答案: 2,大一级问题

算法入门——递推

主要思想: 通过已知的条件(已知结果),利用特定的关系,逐步递推(顺推/逆推),直到有解或者无解. 主要分为两种:顺推,从已知条件出发,直至推出解. 逆推,从已知结果出发,直至推出解. 需要注意的:每一递推结果,都是下一步递推的条件. 顺推: 斐波那契数列  F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*) 实例 兔子的总数有多少? 一对兔子,每月能生一对,而每对兔子3个月后可以生育.求12个月后共有多少兔子. #include<stdio.h> #define

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

//滑动平均滤波算法(递推平均滤波法) //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 =

递推思想

由ACM2047引出: 原题: 今年的ACM暑期集训队一共有18人,分为6支队伍.其中有一个叫做EOF的队伍,由04级的阿牛.XC以及05级的COY组成.在共同的集训生活中,大家建立了深厚的友谊,阿牛准备做点什么来纪念这段激情燃烧的岁月,想了一想,阿牛从家里拿来了一块上等的牛肉干,准备在上面刻下一个长度为n的只由"E" "O" "F"三种字符组成的字符串(可以只有其中一种或两种字符,但绝对不能有其他字符),阿牛同时禁止在串中出现O相邻的情况,他认

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

//滑动平均滤波算法(递推平均滤波法)--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实现

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

第一篇 递推思想

<1> 顺推的例子 上过大学的应该都知道著名的“斐波那契”数列吧,说的是繁殖兔子的问题,题目我就大概说一下. 如果1对兔子每月能生1对小兔子,而每对小兔在它出生后的第3个月就可以生1对小兔子,如果从1对初生的小兔子开始,1年后能 繁殖多少兔子? 思路:其实这个问题我们可以将兔子划分为“1月大的兔子“,”2月大的兔子“,”3月大的兔子“. ① 初始时:            一对1月大小兔子,总数为1对. ② 第一个月:         1月大的小兔子变成2月大的兔子,总数还是1对. ③ 第二个

SOJ【栈】射击游戏(递推思想)

Description 小明很喜欢玩射击游戏.这周末,他完成了数据结构作业之后,又来到了射击娱乐场.他从老板那租了一把步枪和装有N发子弹的弹夹.注意:所有的子弹都从枪口上膛.在射击的过程中,小明每次都有两种选择:从弹夹中取出一颗子弹上膛,或者打一发子弹出去.恰巧,这周二,小明刚上了数据结构中<栈>那一章,于是,他想通过“栈”的数据结构来算出究竟有多少种不同的子弹打出顺序.假设N颗子弹的编号为1,2,…,N.子弹从弹夹中取出的顺序也是从1到N.你可以帮小明解决这个问题吗? Input 可能有多个

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

算法描述 超级素数定义: 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,没有其他的选择了,同理,