题设:
若有一只免子每个月生一只小免子,一个月后小免子也开始生产。起初只有一只免子,一个月后就有两只免子,二个月后有三只免子,三个月后有五只免子(小免子投入生产)......。
这就是著名的不死神兔问题,即Fibonacci数列,一般习惯称之为费氏数列,举例如下: 1、1 、2、3、5、8、13、21、34、55、89......
分析结果显然可以看到,每相邻两个数之和等于第三个数;
下面分别用几种算法实现,比较时间开销;
第三种:使用动态数组模式,效率最高,重复计算最少
public class RabbitDemo {
public static void main(String[] args) {
long l = System.currentTimeMillis();
for (int i =1;i<30;i++){
sumRabit3(i);
}
long l2 = System.currentTimeMillis();
System.out.println("总耗时"+(l2-l));
}
private static void sumRabit3(int i) {
int [] arr = new int[i];
for (int j = 0; j < arr.length; j++) {
if (j == 1||0==j) {
arr[j]=1;
}else {
arr[j]=arr[j-1]+arr[j-2];
}
}
String s = Arrays.toString(arr);
System.out.println(s);
// return arr[i-1];
}
}
方式二:使用递归
public class RabbitDemo {
public static void main(String[] args) {
long l = System.currentTimeMillis();
for (int i =1;i<30;i++){
sumRabit(i);
}
long l2 = System.currentTimeMillis();
System.out.println("总耗时"+(l2-l));
}
private static int sumRabit(int month) {
if (month==1||month==0)
{
return 1;
}else {
int sum = sumRabit(month - 1) + sumRabit(month - 2);
return sum;
}
}
方法一:思路,将前面每个月计算过的值,存入map,后面每次计算的时候从map取值,并将计算后的值添加进map,实际测试计算耗时并无优势,代码需优化,暂不贴代码了。