1. 程式人生 > >斐波那契數列(Fabonacci)兔子練習題

斐波那契數列(Fabonacci)兔子練習題

Java練習題:兔子問題

      此問題又叫斐波那契數列(Fabonacci),是最先研究這個數列的人是比薩的列奧那多(又名費波那契),他描述兔子生長的數目時用上了這數列。

  • 第一個月有一對剛誕生的兔子
  • 第二個月之後它們可以生育
  • 每月每對可生育的兔子會誕生下一對新兔子
  • 兔子永不死去

       假設在 n 月有新生及可生育的兔子總共 a 對,n+1 月就總共有 b 對。在 n+2 月必定總共有 a+b 對: 因為在 n+2 月的時候,所有在 n 月就已存在的 a 對兔子皆已可以生育並誕下 a 對後代;同時在前一月(n+1月)之 b 對兔子中,在當月屬於新誕生的兔子尚不能生育。參照下表:

所經過的月數

1

2

3

4

5

6

7

8

9

10

11

12

新誕生的兔子

0

0

1

1

2

3

5

8

13

21

34

55

兔子對數

1

1

2

3

5

8

13

21

34

55

89

144

由此可用數學歸納法定義為:

    F(n) = F(n-1)+F(n+1);(n>2,F(1)=1,F(2)=1);

如果我們用普通的迭代方法該怎麼樣實現呢?假設我們要列印12個月兔子的對數,程式碼如下:

	public static void main(String args[]) {
		
		int R[] = new int[12];  //每月的兔子數
		
		R[0] = 1;  //第一月份的兔子數
		
		R[1] = 1;  //第二月份的兔子書
		
		for (int a = 2 ; a < 12; a++) {
			R[a] = R[a-1] + R[a-2];  
			System.out.println(R[a]);
		}
	}

程式碼很簡單,用陣列實現,但我們如果用遞迴的話,程式碼更加簡潔:
	public static void main(String args[]) {
		System.out.println(Fbi(12)); //列印
	}
	
	static int Fbi(int i) {
		if (i < 2) return i==0?0:1;
		return Fbi(i-1) + Fbi(i-2); //自己呼叫自己的函式
	}

遞迴的另外一種晦澀點的寫法:

package com.zzk.cn;

/***
 * 古典問題:有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子
 * 假如兔子都不死,每個月的兔子總數為多少?
 * @author zhuzhengke
 *
 */
public class test01 {
    public static void main(String[] args) {
    	testnumber(5);
    }
    
    public static void  testnumber(int i) {
    	System.out.println("第一個月的兔子對數: 1");
    	System.out.println("第二個月的兔子對數: 1");
    	int f1=1,f2=1,f,M=24;
    	for(int k=3;k<=M;k++)               
    	{
    		f=f2;
    		f2=f1+f2;
    		f1=f;
    	System.out.println("第"+ k+"個月的兔子對數:"+f2);
    	}
    }
}