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{

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 next();

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值