每日算法day1
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,则每个月的兔子总数为多少。
第一天:1
第二天:1
第三天:2
第四天 :3
第五天:4+1 第三天的兔子会生了
第六天:5+2+1 第四天的兔子也会生了
。。。
斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……。
找到规律:第N天的兔子 = 第N-1天的兔子 + 第N-2天的兔子
常规递归:
private static long fun(int month){
if(month < 1)
{
return 0;
}
else if(month == 1 || month == 2)
{
return 1;
}
else
{
return fun(month - 1)+fun(month - 2);
}//递归n次,时间复杂度O(2^n)
优化后的递归
private static long fun(int a,int b,int month){
if(month > 2)
{
return fun(a+b,a,month-1);
}
return a;
//优化后的递归
非递归方式:
long res = 1;
long pre = 1;
long temp =0;
for(int i = 3;i <= month;i++){ //看成在单链表优化后的
temp = res;
res = pre + res;
pre = temp;
}
return res;