概念
通过已知条件,利用特定关系逐步递推,最终得到结果为止,核心就是不断的利用现有信息推导出新的东西。
分类
- 顺推:从条件推出结果
- 逆推:从结果推出条件
举例
- 顺推的例子
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
- 思路
兔子的规律为:1,1,2,3,5,8,13,21……
f(1) = 1(第1个月有一对兔子)
f(2) = 1(第2个月还是一对兔子)
f(3) = 2(原来有一对兔子,第3个月开始,每个月生一对兔子)
f(4) = 3(原来有两对兔子,有一对可以生育)
f(5) = 5(原来有三对兔子,第3个月出生的那对兔子也可以生育了,那么现在有两对兔子可以生育)
f(6) = 8(原来有五对兔子,第4个月出生的那对兔子也可以生育了,那么现在有三对兔子可以生育)
……
由以上可以看出,第n个月f(n) = f(n - 1) + f(n - 2)对兔子。
f(n-1)是上个月的兔子数量,是原来有的。
f(n-2)是可以生育的兔子数量,即多出来的数量。第n-2个月开始后的第3个月是第n个月,此时第n-2个月时的兔子都可以生育了。- 代码
public static int function(int i) { if (i == 1 || i == 2) { return 1; } return function(i - 1) + function(i - 2); }
- 逆推的例子
这个一个关于存钱的问题,一位富翁给他儿子的四年大学生活存了一笔钱,富二代每月只能取3000作为下个月的生活费,采用的是整存零取的方式,年利率为1.71%,请问富翁需要一次性存入多少钱。
- 思路
这个题目是我们知道了结果,需要逆推条件, 第48月富二代要连本带利的取走最后3000,那么:
第48个月月初本金 = (第47个月初本金 - 3000) * (1+ 0.0171 / 12)
第47个月月初本金 = (第46个月初本金 - 3000) * (1+ 0.0171 / 12)
第46个月月初本金 = (第45个月初本金 - 3000) * (1+ 0.0171 / 12)
第45个月月初本金 = (第44个月初本金 - 3000) * (1+ 0.0171 / 12)
第44个月月初本金 = (第43个月初本金 - 3000) * (1+ 0.0171 / 12)
……
第2个月月初本金 = (第1个月初本金 - 3000) * (1+ 0.0171 / 12)- 代码
public static double function(int i) { if (i == 48) { return 3000; } return function(i + 1) / (1 + 0.0171 / 12) + 3000; }