一,递推算法概述:
和枚举算法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*)
斐波那契数列又因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”。
这是一个有趣的古典数学问题:有一对兔子,从出生后第三个月起每个月都生一对兔子,小兔
子长到第三个月后每个月又生一对兔。假设所有兔子都不死,问每个月的兔子总数为多少?
推法:从已知的结果
依次类推可以列出下表:
经过月数
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
|
幼仔对数
|
1
|
1
|
1
|
2
|
3
|
5
|
8
|
13
|
21
|
34
|
55
|
89
|
|
成兔对数
|
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.0171
int 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;
}