您的位置:首页 > 编程语言 > Java开发

兔子繁殖问题即斐波那契数列的java实现

2016-03-01 22:03 801 查看
斐波那契数列以兔子繁殖为例子而引入,故又称为“兔子数列”。

一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。初始有一对小兔子,假设所有兔子都不死,那么一年以后可以繁殖多少对兔子?

思路:

每月的兔子总数构成斐波那契数列: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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: