算法——递推算法(顺推、逆推)

1. 顺推法

斐波拉契的“养兔问题

公元1202年,一位意大利比萨的商人斐波拉契(Fibonacci,约1170-1250?)在他的《算盘全书》(这里的“算盘”指的是计算用沙盘)中提出过一个“养兔问题”。

某人买回一对小兔,一个月后小兔长成大兔。再过一个月,大兔生了一对小兔,以后,每对大兔每月都生一对小兔,小兔一个月后长成大兔。如此下去,问一年后此人共有多少对兔子?

表1 兔子的繁殖过程

月份

大兔数量

1月大的

小兔数量

2月大的

小兔数量

兔子总数

初始状态

0

1

0

1

1月

0

0

1

1

2月

1

1

0

2

3月

1

1

1

3

4月

2

2

1

5

5月

3

3

2

8

6月

5

5

3

13

7月

8

8

5

21

8月

13

13

8

34

9月

21

21

13

55

10月

34

34

21

89

11月

55

55

34

144

12月

89

89

55

233

clip_image002为第n个月份的兔子总数,数学模型:

clip_image004

clip_image006

 

C#代码实现

 

Matlab代码实现

 

运行结果

clip_image008

 

2. 逆推法

小龙的父亲供小龙4年(48个月)大学读书,采用整存零取的方式,一次性预存一笔钱于银行,小龙每个月月初取1000元。假设银行年利率为0.0171,若要求在第48个月小龙大学毕业时连本带息要取1000元,则应该一次性预存多少钱?

设每个月月末存款为clip_image002[1],其中clip_image011表示月份,n=0时表示第一月的月初,数学模型为:

clip_image013

clip_image015

 

C#代码实现

 

Matlab代码实现

 

运行结果

clip_image017

不考虑利息,则须存48000元,由于利息的存在只需要存入47363元。关键取决于利息的大小,利息不大的情况下,可直接存入48000元,利息生出的钱可作为奖赏。

你可能感兴趣的:(算法)