八大算法思想(二)------------------递推算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32211827/article/details/73005065

一,递推算法概述:

和枚举算法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.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;
}















































猜你喜欢

转载自blog.csdn.net/qq_32211827/article/details/73005065