八大算法思想(二)------------------递推算法
来源:互联网 发布:ubuntu更新内核命令 编辑:程序博客网 时间:2024/05/20 05:57
一,递推算法概述:
和枚举算法http://blog.csdn.net/qq_32211827/article/details/72970404相比,递推算法就比较“聪明”了,递推算法能通过已知某个条件,利用特定的关系得出中间推论,然后逐步递推,直到得到结果为止。由此可见,递推算法要比枚举算法“聪明”,它不会"一根筋"的寻找每一种可能方案。
(1)顺推法:从已知条件出发,逐步推算出要解决的方法。例如裴波那契数列就可以通过顺推法不断推算出新的数据。
(2)逆推法:从已知的结果出发,用迭代表达式逐步推算出问题开始的条件,即顺推法的逆过程。
裴波那契数列可以说是典型的递推算法:
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契
(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:
1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,
F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)
斐波那契数列又因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”。
这是一个有趣的古典数学问题:有一对兔子,从出生后第三个月起每个月都生一对兔子,小兔
子长到第三个月后每个月又生一对兔。假设所有兔子都不死,问每个月的兔子总数为多少?
推法:从已知的结果
依次类推可以列出下表:
经过月数
0
1
2
3
4
5
6
7
8
9
10
11
12
幼仔对数
1
0
1
1
2
3
5
8
13
21
34
55
89
成兔对数
0
1
1
2
3
5
8
13
21
34
55
89
144
总体对数
1
1
2
3
5
8
13
21
34
55
89
144
233
二,Fibonacci数列的实现:
/**************************************************************************************************************************文件说明:* Fibonacci数列实现*开发环境:* Win10+VS2015+OpenCv3.2.0*时间地点:* 陕西师范大学.文津楼 2017.6.10*作者信息:* 李Sir**************************************************************************************************************************/#include<stdio.h>#include<Windows.h>int main(){int fib[20] = { 1,1 };//定义一个数组,默认前两个月的兔子数各位一对for (int i = 2; i < 20; i++)//计算前20个月每个月的兔子对数 {fib[i] = fib[i - 1]+fib[i - 2];//每个月的兔子对数是前两个月兔子对数的总和}for (int i = 0; i < 20; i++)//按照一定的格式输出前二十个月的个数对数{printf("第%d个月的兔子数为:%d\n", i, fib[i]);}system("pause");return 0;}
三,举一反三:银行存款问题
母亲为儿子Frank的四年大学学费准备了一笔存款,方式是整存零取,规定Frank每月月底取下一个月的生活费。现在假设利率为1.71%,编写程序,计算母亲最少需要存多少钱?可以采用逆推法分析存钱和取钱的过程,因为按照月为周期取钱,所以共四年48个月,并分别对每个月进行计算。如果在第48个月后sun大学毕业时连本带利要取1000元,这要求出前47个月时银行存款的钱数。(1)第47月月末存款=1000(1+0.0171/12)(2)第46月月末存款=(47月月末存款+1000)/(1+0.0171/12)(3)第45月月末存款=(46月月末存款+1000)/(1+0.0171/12)(4)第44月月末存款=(45月月末存款+1000)/(1+0.0171/12)...................(47)第2月月末存款=(第三个月月末存款+1000)/(1+0.0171/12)(48)第1月月末存款=(第二个月月末存款+1000)/(1+0.0171/12)/**************************************************************************************************************************文件说明:* Fibonacci数列实现*开发环境:* Win10+VS2015+OpenCv3.2.0*时间地点:* 陕西师范大学.文津楼 2017.6.10*作者信息:* 李Sir**************************************************************************************************************************/#include<stdio.h>#include<Windows.h>#define FETCH 1000 //每个月要取的金额(第48个月要取的金额)#define RATE 0.0171int main(){double corpus[49];int i;corpus[48] = (double)FETCH;for (i = 47; i > 0; i--){corpus[i] = (corpus[i + 1] + FETCH) / (1 + RATE / 12);}for (i = 48; i > 0; i--){printf("%d月月末本利共计:%.2f\n", i, corpus[i]);}system("pause");return 0;}
/**************************************************************************************************************************文件说明:* Fibonacci数列实现*开发环境:* Win10+VS2015+OpenCv3.2.0*时间地点:* 陕西师范大学.文津楼 2017.6.10*作者信息:* 李Sir**************************************************************************************************************************/#include<stdio.h>#include<Windows.h>#define FETCH 1000 //每个月要取的金额(第48个月要取的金额)#define RATE 0.0171int main(){double corpus[49];int i;corpus[48] = (double)FETCH;for (i = 47; i > 0; i--){corpus[i] = (corpus[i + 1] + FETCH) / (1 + RATE / 12);}for (i = 48; i > 0; i--){printf("%d月月末本利共计:%.2f\n", i, corpus[i]);}system("pause");return 0;}
阅读全文
0 0
- 八大算法思想(二)------------------递推算法
- 八大算法思想(二)------------------递归算法
- 递推算法思想
- 八大算法思想(一)------------------枚举算法
- 八大算法思想
- 算法之递推思想
- 常用算法思想之:递推思想
- 常用算法思想--递推算法
- 八大排序算法(二)
- java算法学习笔记--穷举算法/递推算法思想
- 基本算法思想之递推算法思想(C++语言描述)
- 八大排序算法(二)希尔排序
- C++八大排序算法(二)
- 算法思想篇(2)————递推算法
- 八大排序算法实战:思想与实现
- 八大排序算法实战:思想与实现
- ACM 算法竞赛 八大基础算法 模拟法 字符串 递归分治 排序 枚举 贪心 递推
- 递推思想 系列二
- 802.11n协议帧格式详解
- 兼容性测试实习
- 人工智能课实践-一字棋问题
- 将十进制数字转换为二进制
- 四、4、数组方法
- 八大算法思想(二)------------------递推算法
- py实现网关功能
- think python 课后题实现
- 同步代码块解决线程安全
- [BZOJ3672][NOI2014]购票-点分治-CDQ分治-斜率优化DP
- 802.11协议帧基本格式详解
- ArcGis地图的配准总结
- 【Java】有状态会话bean和无状态会话bean
- 2017年上半年总结:大三下学期,马上大四,马上要毕业了.