算法思想篇(2)————递推算法
递推算法不断利用已有的信息推导出新的东西。在日常应用中有如下两种递推算法。
(1)顺推法:从已知条件出发,逐步推算出要解决问题的方法。例如斐波那契数列就可以通过顺推法不断递推算出新的数据。
(2)逆推法:从已知的结果出发,用迭代表达式逐步推算出问题开始的条件,即顺推法的逆过程。
用两个例子说明枚举算法的思想:
(1)菲波那切数列的“兔子问题”:一般而言,兔子在出生两个月后就有了繁衍能力一对兔子每个月能生出一对小兔子来,如果所有的兔子都不死,那么一年以后可以繁衍多少对兔子?
代码如下:
//start from the very beginning,and to create greatness
//@author: Chuangwei Lin
//@E-mail:979951191@qq.com
//@brief: 菲波那切数列递推
#include <stdio.h>
#define NUM 13//定义常量,第0个月到12月
int main()
{
int i;
long fib[NUM] = {1,1}; //前两个月的数量
for(i=2;i<NUM;i++)
{
fib[i] = fib[i-1]+fib[i-2]; //递推得出每个月的兔子数量
}
//输出每个月的兔子数量
for(i=0;i<NUM;i++)
{
printf("第%d月兔子总数:%d\n", i, fib[i]);
}
return 0;
}
运行结果:
(2)银行存款问题:母亲为儿子小林的4年大学生活费准备了一笔存款,方式是整存零取,规定小林每月月底去取一个月的生活费(假设每月都取1000),现在假设银行的年利息为1.71%,计算母亲最少需要存入多少钱?
代码如下:
//start from the very beginning,and to create greatness
//@author: Chuangwei Lin
//@E-mail:979951191@qq.com
//@brief: 银行取钱逆推
#include <stdio.h>
#define FETCH 1000//每月取出1000
#define RATE 0.0171//年利息
int main()
{
double corpus[49];//数组用于存储4年(48个月)的本息和
int i;
corpus[48]=(double)FETCH;//最后一个月取出1000元
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]);
}
return 0;
}
运行结果如下: