1. 程式人生 > >兔子繁殖問題即斐波那契數列的java實現

兔子繁殖問題即斐波那契數列的java實現

斐波那契數列以兔子繁殖為例子而引入,故又稱為“兔子數列”。
一般而言,兔子在出生兩個月後,就有繁殖能力,一對兔子每個月能生出一對小兔子來。初始有一對小兔子,假設所有兔子都不死,那麼一年以後可以繁殖多少對兔子?
思路:                                                    
每月的兔子總數構成斐波那契數列:1、1、2、3、5、8、13、……。這個數列有個十分明顯的特點:前面相鄰兩項之和,構成了後一項。

假設F(n)為第n月的兔子總數,有如下定義:F(1)=1;F(2)=1;F(n)=F(n-1)+F(n-2);

java實現程式碼如下:

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Fibonacci implements Generator<Integer>{
	private int count =  0;
	protected int times = 20;
	public Fibonacci(){}
	public Fibonacci(int times){
		this.times = times;
	}
	public static void main(String[] args) {
		
		//控制檯輸入
		Scanner scanner = new Scanner(System.in);
		System.out.println("Please input the fibonacci n :");
		String str = scanner.nextLine();
		
		//校驗正整數
		Pattern pattern = Pattern.compile("^[1-9]+\\d*$");
		Matcher matcher = null;
		while(true){
			matcher = pattern.matcher(str);
			if(!(matcher.matches())){
				System.out.println("輸入不合法,請輸入大於0的數字!");
				str = scanner.nextLine();
			}else{
				break;
			}
		} 
		int n = Integer.valueOf(str).intValue();
		
		//遞迴
		Fibonacci fib = new Fibonacci(n);
		System.out.println("Generate a Fibonacci sequence in recursion algorithm : ");
		for(int  i = 0;i < fib.times;i++ ){
			System.out.print( fib.next() + "\t\t");
			if((i +1)%5 == 0){
				System.out.print("\n");
			}
		}
		
		//遞推
		for(int i = 0;i < n;i++){
			System.out.print(fib.induceFib(i) + "\t\t");
			if((i +1)%5 == 0){
				System.out.print("\n");
			}
		}
	}
	/**
	 * 遞迴實現
	 * @param n
	 * @return
	 */
	private int recursionFib(int n){
		if(n < 2){
			return 1;
		}
		return recursionFib(n-2) + recursionFib(n-1);
	}
	@Override
	public Integer next() {
		return recursionFib(count++);
	}
	/**
	 * 歸納遞推實現
	 * @param n
	 * @return
	 */
	private int induceFib(int n){
		int nonius1 = 1,nonius2 = 1,noniusSum = 0;
		if(n < 2){
			return 1;
		}
		for(int i = 0;i < n;i++){
			noniusSum = nonius1 + nonius2;
			nonius1 = nonius2;
			nonius2 = noniusSum; 
		}
		return noniusSum;
	}

}

public interface Generator<T> {
		T next();
}