兔子繁殖問題即斐波那契數列的java實現
阿新 • • 發佈:2019-02-15
斐波那契數列以兔子繁殖為例子而引入,故又稱為“兔子數列”。
一般而言,兔子在出生兩個月後,就有繁殖能力,一對兔子每個月能生出一對小兔子來。初始有一對小兔子,假設所有兔子都不死,那麼一年以後可以繁殖多少對兔子?
思路:
每月的兔子總數構成斐波那契數列:1、1、2、3、5、8、13、……。這個數列有個十分明顯的特點:前面相鄰兩項之和,構成了後一項。
一般而言,兔子在出生兩個月後,就有繁殖能力,一對兔子每個月能生出一對小兔子來。初始有一對小兔子,假設所有兔子都不死,那麼一年以後可以繁殖多少對兔子?
思路:
每月的兔子總數構成斐波那契數列: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(); }