費式數列運算結果

說到費式數列,我印象很深刻。

高中的時候,有學到等差數列、等比數列,在這個單元的考試,就會拿其他有的沒的數列來考我們,要我們找規則,然後寫出第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個月的兔子對數,早就超過這個數字了,難怪跑不出來。

 

關於我

  關注社群|FB粉絲團追蹤IG:麻鼠揪麻將

◎  購買貼圖布丁鼠貼圖小元仔藥師貼圖

◎  點擊以下連結購物(您不會有額外支出,但我會有微薄的獎金)

蝦皮購物    hahow  

Klook  KKday  booking

 

 


arrow
arrow

    元元不絕 發表在 痞客邦 留言(0) 人氣()