說到費式數列,我印象很深刻。
高中的時候,有學到等差數列、等比數列,在這個單元的考試,就會拿其他有的沒的數列來考我們,要我們找規則,然後寫出第100、101等等的數字是多少?
其中,費式數列就考了好幾次,每本講義都會出現,明明跟等差數列、等比數列沒有關係。
費式數列的故事
很久以前,有一對兔子,這一對兔子,出生後第3個月起(也就是2個月後),每個月都能再生一對兔子,而這對小兔子長到第3個月後,每個月又能再生一對兔子。
假設兔子都不死,問第20個月的兔子對數為多少?
這是鼎鼎大名的費式數列,也就是下面這個數列:
費式數列:1、 1、 2、 3、 5、 8、 13、 21、 34、 55、 89、 144、 233、 377、 610、 987……
分解開來看:
第1個月:1對
第2個月:1+0對
第3個月:1+0+1對
第4個月:1+0+1+1對
第5個月:1+0+1+1+2對
第6個月:1+0+1+1+2+3對
第7個月:1+0+1+1+2+3+5對
第8個月:1+0+1+1+2+3+5+8對
……
由此可以觀察,第n個月的兔子對數,及為第n-1個月的兔子對數,加上n-2個月的兔子對數,也就是:f(n)=f(n-1)+f(n-2)
也可以這樣思考:
第n個月的兔子對數=(上個月原本的兔子數量)+(這個月生的兔子數量)
上個月原本的兔子數量=f(n-1)
這個月生的兔子數量=f(n-2),因為兩個月前的這些兔子都可以生了,換句話說,f(n-2)就是所有可以生的兔子數量。
JAVA程式碼
public static void main(String[] args) {
System.out.print("請輸入你想知道的兔子數量的月份:");
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();//獲取輸入的整數
System.out.println("第"+n+"個月兔子總數為"+fun(n));
scanner.close();
}
private static int fun(int n){
if(n==1 ||n==2)
return 1;
else
return fun(n-1)+fun(n-2);
} }
1、scanner類別是接收前端輸入的資料,nextInt()接收為整數型態,next沒有下一個的意思。scanner.close(),養成用完關掉的習慣。
2、if(n==1 ||n==2) return 1;
因為前兩個沒辦法套用公式,沒有f(n-2)的情形,所以寫個但書,假如前端輸入1或2,那麼就回傳1就好。
3、fun(n-1)+fun(n-2)
單純是費式數列的公式:f(n)=f(n-1)+f(n-2),寫成程式碼的樣子而已。
▼ 程式執行結果
當前端輸入第n個月後,就可以知道該月的兔子對數為多少?
該開始我輸入100,環境跑不出來,我還以為哪裡寫錯了,一行一行debug,後來才想起來自己設的資料類型為int,上限為2147483647,也就是2的31次方-1,
顯然第100個月的兔子對數,早就超過這個數字了,難怪跑不出來。