思考邏輯:
x:成年細胞 y:幼年細胞
f(0) = x = 1
過一個月後↓↓上個月的成年細胞的迸出兩個幼年細胞,上個月的幼年細胞變成成年細胞
f(1) = x + 2y = 3
過一個月後↓↓上個月的成年細胞的迸出兩個幼年細胞,上個月的幼年細胞變成成年細胞
f(2) = x + 2y + 2x = 3x + 2y = 5
過一個月後↓↓上個月的成年細胞的迸出兩個幼年細胞,上個月的幼年細胞變成成年細胞
f(3) = 3x + 6y + 2x = 5x + 6y = 11
過一個月後↓↓上個月的成年細胞的迸出兩個幼年細胞,上個月的幼年細胞變成成年細胞
f(4) = 5x + 10y + 6x = 11x + 10y = 21
… 以此類推
public static int CellNumber(int n_month){
if(n_month==0)
return 1;
else if(n_month==1);
return 3;
else
return CellNumber(n_month-1) + 2*CellNumber(n_month-2);
// 上月的沒迸,只是變成年 + 前月的有迸兩個幼年
}
int CellNumber(int months, int adult, pre_baby){
int baby = adult*2;
int adult = pre_baby; //前個月baby長大
int sum = adult + baby; //當月成長
if (month == 1){
return sum;
}
CellsNumber(months-1, adult, baby)
}
int CellNumber(int mon,int Cn_1,int An_1)
{
int Cn=0; //第N個月的幼體細胞數量
int An=0;//第N個月的成體細胞數量
if(mon>0)//當月份mon比0大 ,就要計算n月的幼與成體數量
{
Cn=An_1*2; //每一個本(n-1)月的成體數量在下一月(n)生出兩個幼體
An=Cn_1+An_1;//每一個本(n-1)月的幼體數量在下一月(n)長成1個幼體,再加上本月(n-1)原有的成體數量,就是下一個(n)月的成體數量
--mon;
return CellNumber(mon,Cn,An);
}
else
return (fn_1+Fn_1);//如果上一個月就是經過了第mon個月(已經計算完了mon==0),就將上一個月的幼體與成體數量加起來,傳回去
}